LINQ将数据表映射到列表
我刚发现LINQ,请跟我一起全面! 🙂
所以! 我有一个数据层,它为我提供数据表,我想将它们转换为对象列表。 这些对象在spécific层DTO(数据传输对象)中定义。
如何将数据表的每一行映射到对象中并将所有对象放入列表中? (今天我在场后“手动”字段)是否可以使用LINQ? 我听说过LINQ2Entities? 我对吗?
感谢帮助初学者理解……
如果对象不是太复杂,您可以使用:
public static class DataTableExtensions { public static IList ToList (this DataTable table) where T : new() { IList properties = typeof(T).GetProperties().ToList(); IList result = new List (); foreach (var row in table.Rows) { var item = CreateItemFromRow ((DataRow)row, properties); result.Add(item); } return result; } private static T CreateItemFromRow (DataRow row, IList 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
。
你可以在这里阅读: http : //blog.tomasjansson.com/convert-datatable-to-generic-list-extension/
这是对前一个问题的回答: 在C#中将DataTable转换为通用列表
编辑:我应该补充一点,这不是linq,而是我编写的一些DataTable
扩展方法。 此外,它正在使用约定,即您要映射的对象中的属性与DataTable中的属性相同。 当然,这可以扩展为读取属性上的属性,或者方法本身可以采用可用于执行映射的简单Dictionary
。 您还可以使用一些params string[] excludeProperties
来扩展它,这些函数可用于排除某些属性。
我建议阅读有关ADO.NETentity framework的内容 。 它支持你所要求的,链接应该为你提供足够的信息和例子:)
还有很多关于这个主题的教程可以帮助您入门。
最好检查行中是否存在列以进行映射,否则将引发exception,在我的情况下,我有两个对象,其中一个具有比另一个更具有相同名称和数据类型的特性
private static T CreateItemFromRow(DataRow row, IList 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; }