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

时间:2011-07-19 14:34:55

标签: c# linq generics reflection .net-4.0

我正在尝试重构一些方法,以避免在对象映射中重复自己。这些功能在SO question中列出。

我有一个通用方法,它将调用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?
            });
        }
}

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我会考虑使用AutoMapper

答案 2 :(得分:0)

我猜这不是好习惯,但这就是我所做的:

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