【问题标题】:LINQ to map a datatable into a list<MyObject>LINQ 将数据表映射到列表<MyObject>
【发布时间】:2011-05-10 17:29:05
【问题描述】:

我刚刚发现 LINQ,所以请全面了解我! :-)

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

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

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

【问题讨论】:

    标签: c# linq dto 3-tier


    【解决方案1】:

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

    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&lt;YourEntityType&gt;()

    你可以在这里阅读:http://blog.tomasjansson.com/convert-datatable-to-generic-list-extension/

    这是对上一个问题的回答:Convert DataTable to Generic List in C#

    编辑:我应该补充一点,这不是 linq,而是我写的 DataTable 的一些扩展方法。此外,它使用的约定是您要映射的对象中的属性与 DataTable 中的属性名称相同。当然,这可以扩展为读取属性上的属性,或者方法本身可以采用简单的Dictionary&lt;string,string&gt; 来进行映射。您还可以使用一些功能对其进行扩展,这些功能采用 params string[] excludeProperties,可用于排除某些属性。

    【讨论】:

    • 好极了,看来这正是我想做的!但这是我必须写的一门课吗?为什么 DataTableExtensions 不继承自 DataTable?
    • 它不继承,因为它是一种扩展方法,所以它适用于所有数据表。我提供的代码只是为了满足我的需要而组合在一起的,您可能需要添加额外的功能,例如 null 检查和我在 EDIT 部分中编写的部分。只需在您要使用的文件中包含您的扩展名称空间,它应该可以工作......就像魔术一样 :) 此外,如果它回答了您的问号,则表示已回答。
    • 只要您了解属性映射到列的约定,您就可以了。如果您需要其他方式,即IList&lt;T&gt;DataTable,我在我的博客 blog.tomasjansson.com 上有。
    【解决方案2】:

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

    还有关于该主题的plenty of tutorials 可以帮助您入门。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-27
        • 1970-01-01
        • 2021-04-28
        • 2021-10-12
        相关资源
        最近更新 更多