LINQ将数据表映射到列表<myobject> </myobject>

时间:2010-11-16 10:05:26

标签: c# linq dto 3-tier

我刚发现LINQ,请跟我一起全面了! : - )

原来如此!我有一个数据层,它为我提供数据表,我想将它们转换为对象列表。这些对象在spécific层DTO(数据传输对象)中定义。

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

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

3 个答案:

答案 0 :(得分: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功能扩展它。

答案 1 :(得分:0)

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

还有plenty of tutorials关于让你开始的话题。

答案 2 :(得分: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;
   }