如何将类似的linq2sql生成的结果映射到单个对象
本文关键字:结果 映射 对象 单个 linq2sql | 更新日期: 2023-09-27 18:03:01
我正在尝试重构一些方法,以避免在对象映射中重复自己。在这个SO问题中给出了函数。
我有一个通用方法,它将调用4个存储过程中的一个,返回具有相同字段的结果,只是不同的数据子集。linq2sql为每个存储过程生成一个不同的Result对象。
是否有一种方法将结果映射到我的服务器对象?需要反思吗?
private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders)
{
List<MyObj> myObj = new List<MyObj>();
var result = from a in getMyObjData()
select a;
foreach (var row in result)
{
myObj.Add(new MyObj()
{
Id = row.id,
Description = row.descr,
// ...etc
// These fields are shared across the result types...
// is there a way to make the compiler recognize that?
});
}
}
linq应该是这样的:
var result = from a in getMyObjData()
select new { Id = a.id, Description = a.description };
一个很好的linq资源是101 linq Samples.
编辑:
这取决于你的需求。上面是创建泛型对象的一个非常简单的例子。
一个更好的答案应该是你在下面看到的,因为它实际上创建了你需要的类型的对象。
MyObject newOject = from item in getMyObjData()
select new MyObject()
{
Id = item.Id,
Description = item.description
};
我会考虑使用AutoMapper。
我猜这不是一个好的做法,但这就是我所做的:
private static List<DistroHeader> getHeaders<T>(Func<IEnumerable<T>> getHeaders)
{
List<MyObj> myObj = new List<MyObj>();
var result = from a in getMyObjData()
select a;
var pi = new List<PropertyInfo>(typeof(T).GetProperties());
foreach (var row in result)
{
myObj.Add(new MyObj()
{
Id = (int)pi.Find(x => x.Name == "id").GetValue(row, null),
Description = (string)pi.Find(x => x.Name == "descr").GetValue(row, null),
// ...etc
});
}
}