2015-08-27 2 views
0

Я пытаюсь выполнить цикл данных, чтобы создать список объектов, каждый из которых имеет список объектов. Вот как выглядят данныеСоздание пользовательских объектов из DataTable с использованием LINQ

AccountID AccountName ListItem 
------------------------------------ 
1   Foo   Item1 
1   Foo   Item2 
2   Test   Value1 
2   Test   Value2 
2   Test   Value3 
3   Bar   List1 
3   Bar   List2 
3   Bar   List3 

Другие сообщения, которые я видел, не совсем решили мою проблему. По моим данным, я ожидал бы создать 3 Account объектов, каждый из которых имеет List<string> данных ListItem.

Я надеялся, что сделать что-то вроде этого:

var accountGroups = myDataTable.GroupBy(x=>x.Field<string>("AccountName")); 

, а затем петлю через accountGroups добавить ListItems, но, конечно, DataTable не реализует IEnumerable<T>

Возможно ли это с помощью LINQ или должен Я просто пишу цикл вручную?

+0

вы можете сделать это 'myDataTable.Rows.GroupBy (. .) 'или' myDataTable.AsEnumerable(). GroupBy (..) ' – ASh

ответ

1

DataTable не реализует IEnumerable<T>

Не сразу, но есть метод AsEnumerable() расширение в System.Data.DataRowExtensions, который превратит его в IEnumerable<DataRow>.

var accountGroups = myDataTable.AsEnumerable() 
           .GroupBy(x=>x.Field<string>("AccountName")) 
           .Select(g => new Account { 
            AccountName = g.Key, 
            List = g.Select(g => g.Field<string>("ListItem").ToList() 
           }); 
0

но конечно DataTable не реализует IEnumerable

Вы можете использовать метод расширения AsEnumerable:

IEnumerable<List<string>> accountListItems = myDataTable.AsEnumerable() 
    .GroupBy(row => row.Field<string>("AccountName")) 
    .Select(g => g.Select(row => row.Field<string>("ListItem")).ToList()); 
Смежные вопросы