如何将类似的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?
            });
        }
}

如何将类似的linq2sql生成的结果映射到单个对象

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      
        });
    }
}