9

我刚刚发现 LINQ,所以请全面介绍一下我!:-)

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

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

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

4

3 回答 3

21

如果对象不是太复杂,你可以使用这个:

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

有了它,您现在可以编写: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可用于排除某些属性。

于 2010-11-16T10:57:03.857 回答
0

我建议阅读ADO.NET Entity Framework。它支持您的要求,并且该链接应为您提供足够的信息和示例:)

还有很多关于该主题的教程可以帮助您入门。

于 2010-11-16T10:19:36.360 回答
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;
   }
于 2017-03-07T15:32:03.027 回答