2010-11-16 42 views
8

我只是發現LINQ,所以請全面瞭解我! :-)LINQ將數據表映射到列表中<MyObject>

所以!我有一個數據層爲我提供數據表,我想將它們轉換爲對象列表。這些對象在特定層DTO(數據傳輸對象)中定義。

如何將我的數據表的每一行映射到對象中並將所有對象放入列表中? (今天我把它做成「手動」字段後) LINQ可以嗎?我聽說過LINQ2Entities?我對嗎?

感謝幫助初學者瞭解...

回答

19

如果對象是不是太複雜,你可以使用這個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的功能擴展它,這些功能可以用來排除一些屬性。

+0

非常好,它似乎正是我想要做的!但是這是我必須寫的一堂課嗎?爲什麼DataTableExtensions不能從DataTable繼承? – bAN 2010-11-16 13:38:39

+0

它不會繼承,因爲它是一種擴展方法,所以它適用於所有DataTable。我提供的代碼只是爲了滿足我的需求而放在一起的,您可能需要添加額外的功能,如空檢查和我在**編輯**部分編寫的部分。只需將你的擴展命名空間包含在你想要使用它的文件中,它應該可以工作......就像魔術一樣:)另外,如果它回答了你的問號,則回答。 – 2010-11-16 13:49:08

+0

你是對的,它只是神奇的! :-) – bAN 2010-11-16 14:23:28

0

我建議閱讀有關The ADO.NET Entity Framework。它支持你所要求的,鏈接應該爲你提供足夠的信息和例子:)

也有plenty of tutorials那裏有關於這個話題,讓你開始。在地方

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

有了,你可以這樣寫:

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