2013-04-15 2 views
0

Я пытаюсь выполнить динамический групповой запрос linq. Второй оператор linq должен генерировать тот же результат, что и первый оператор linq.
Может ли кто-нибудь показать мне, почему второй оператор linq не работает?Группа Linq по заявлению

DataTable dt = new DataTable(); 
dt.Columns.Add("ID"); 
dt.Columns.Add("Name"); 
dt.Columns.Add("ProductName"); 

dt.Rows.Add("1", "aa", "TypeA"); 
dt.Rows.Add("2", "bb", "TypeA"); 
dt.Rows.Add("3", "cc", "TypeB"); 

Первый LINQ:

var lotSum = dt.AsEnumerable() 
       .GroupBy(x => new 
          { id = x.Field<string>("id") 
           , product = x.Field<string>("ProductName"), 
          } 
         ).ToList(); 

Второй Linq // косяк работа ??

var gcol = new string[] { "ID", "ProductName" }; 
var gtype = dt.Rows[0].GetType(); 
var lotSum2 = dt.AsEnumerable() 
       .GroupBy(g => string.Join(",", 
      gcol.Select(c => gtype.GetProperty(c).GetValue(g, null)))).ToList(); 
+0

Второй LINQ отличается от первого - второй не проектирует анонимный тип (что является причиной того, что группа по 2 полям работает в 1-м LINQ, кстати). – code4life

+0

Не будет ли второе исключение, поскольку «ID» и «ProductName» не являются общедоступными свойствами типа DataRow? –

ответ

0

ID и ProductName не являются свойствами DataRow, они являются имена столбцов. Вы можете получить к ним доступ с помощью индексатора ... gcol.Select (c => g [c]), предполагая, что g является DataRow.

Смежные вопросы