2010-11-16 43 views
8

我只是发现LINQ,所以请全面了解我! :-)LINQ将数据表映射到列表中<MyObject>

所以!我有一个数据层为我提供数据表,我想将它们转换为对象列表。这些对象在特定层DTO(数据传输对象)中定义。

如何将我的数据表的每一行映射到对象中并将所有对象放入列表中? (今天我把它做成“手动”字段后) LINQ可以吗?我听说过LINQ2Entities?我对吗?

感谢帮助初学者了解...

回答

19

如果对象是不是太复杂,你可以使用这个var list = YourDataTable.ToList<YourEntityType>()

你可以阅读一下:http://blog.tomasjansson.com/convert-datatable-to-generic-list-extension/

而且它的回答上一个问题:Convert DataTable to Generic List in C#

编辑:我要补充,这是不LINQ,但一些扩展方法DataTable我写了。此外,它正在使用约定,您映射的对象中的属性与DataTable中的属性名称相同。当然,这可以扩展为读取属性上的属性,或者方法本身可以采用简单的Dictionary<string,string>来进行映射。你也可以用一些params string[] excludeProperties的功能扩展它,这些功能可以用来排除一些属性。

+0

非常好,它似乎正是我想要做的!但是这是我必须写的一堂课吗?为什么DataTableExtensions不能从DataTable继承? – bAN 2010-11-16 13:38:39

+0

它不会继承,因为它是一种扩展方法,所以它适用于所有DataTable。我提供的代码只是为了满足我的需求而放在一起的,您可能需要添加额外的功能,如空检查和我在**编辑**部分编写的部分。只需将你的扩展命名空间包含在你想要使用它的文件中,它应该可以工作......就像魔术一样:)另外,如果它回答了你的问号,则回答。 – 2010-11-16 13:49:08

+0

你是对的,它只是神奇的! :-) – bAN 2010-11-16 14:23:28

0

我建议阅读有关The ADO.NET Entity Framework。它支持你所要求的,链接应该为你提供足够的信息和例子:)

也有plenty of tutorials那里有关于这个话题,让你开始。在地方

public static class DataTableExtensions 
{ 
    public static IList<T> ToList<T>(this DataTable table) where T : new() 
    { 
     IList<PropertyInfo> properties = typeof(T).GetProperties().ToList(); 
     IList<T> result = new List<T>(); 

     foreach (var row in table.Rows) 
     { 
     var item = CreateItemFromRow<T>((DataRow)row, properties); 
     result.Add(item); 
     } 

     return result; 
    } 

    private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new() 
    { 
     T item = new T(); 
     foreach (var property in properties) 
     { 
      property.SetValue(item, row[property.Name], null); 
     } 
     return item; 
    } 
} 

有了,你可以这样写:

0

这是更好的检查列是否存在行中执行映射的另一种方式,它会抛出一个异常,在我的情况下,我有两个对象其中一个比另一个具有更多的礼貌相同的名称和数据类型

private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new() 
    { 
     T item = new T(); 
     foreach (var property in properties) 
     { 
      if (row.Table.Columns.Contains(property.Name)) 
      { 
      property.SetValue(item, row[property.Name], null); 
      } 
     } 
     return item; 
    }