C# LINQ将数据表映射到列表中<;MyObject>;

C# LINQ将数据表映射到列表中<;MyObject>;,c#,linq,dto,3-tier,C#,Linq,Dto,3 Tier,我刚刚发现林克,所以请对我全面一点!:-) 所以!我有一个数据层,它为我提供数据表,我想把它们转换成对象列表。这些对象在特定层DTO(数据传输对象)中定义 如何将数据表的每一行映射到对象中,并将所有对象放入列表中?(今天我一个字段接一个字段地“手动”完成) 林克有可能吗?我听说了林奇的事?我说得对吗 感谢帮助初学者理解…我建议阅读关于。它支持您提出的问题,链接应为您提供足够的信息和示例:) 还有一些关于该主题的内容可以让您开始学习。如果对象不太复杂,您可以使用以下内容: public stati

我刚刚发现林克,所以请对我全面一点!:-)

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

如何将数据表的每一行映射到对象中,并将所有对象放入列表中?(今天我一个字段接一个字段地“手动”完成) 林克有可能吗?我听说了林奇的事?我说得对吗


感谢帮助初学者理解…

我建议阅读关于。它支持您提出的问题,链接应为您提供足够的信息和示例:)


还有一些关于该主题的内容可以让您开始学习。

如果对象不太复杂,您可以使用以下内容:

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;
   }
}
公共静态类DataTableExtensions
{
公共静态IList ToList(此数据表),其中T:new()
{
IList properties=typeof(T).GetProperties().ToList();
IList结果=新列表();
foreach(表中的变量行。行)
{
var item=CreateItemFromRow((DataRow)行,属性);
结果.添加(项目);
}
返回结果;
}
私有静态T CreateItemFromRow(DataRow行,IList属性),其中T:new()
{
T项=新的T();
foreach(属性中的var属性)
{
property.SetValue(项,行[property.Name],null);
}
退货项目;
}
}
有了它,您现在可以编写:
var list=YourDataTable.ToList()

您可以在此处阅读:

这是对前面一个问题的回答:


EDIT:我应该补充一点,这不是linq,而是我编写的
DataTable的一些扩展方法。此外,它使用的约定是,映射对象中的属性与数据表中的属性具有相同的名称。当然,这可以扩展到读取属性上的属性,或者方法本身可以使用一个简单的
字典
,用于进行映射。您还可以使用一些功能对其进行扩展,这些功能采用可用于排除某些属性的
params string[]excludeProperties

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

  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;
   }
private static T CreateItemFromRow(DataRow行,IList属性),其中T:new()
{
T项=新的T();
foreach(属性中的var属性)
{  
if(row.Table.Columns.Contains(property.Name))
{
property.SetValue(项,行[property.Name],null);
}
}
退货项目;
}

好极了,看来这正是我想要做的!但这是我必须写的课程吗?为什么DataTableExtensions不从DataTable继承?它不继承,因为它是一个扩展方法,所以它适用于所有DataTable。我提供的代码只是为了满足我的需要而编写的,您可能需要添加额外的功能,如空检查和我在编辑部分编写的部分。只需将您的扩展名称空间包含在您想要使用的文件中,它就可以工作了。。。就像magic:)同样,如果它回答了你的问题,那么你的问题就已经被回答了。只要你知道属性映射到列的约定,你就可以了。如果您需要另一种方式的东西,也就是说,
IList
DataTable
我在blog.tomasjanson.com的博客上有这个。