2010-06-28 5 views
1

У меня есть код, который группирует таблицу с помощью «Value1» и некоторых циклов, которые добавляют верхнюю строку каждой группы в список. Это довольно уродливый способ сделать это, и мне было интересно, могу ли я заменить одну из циклов foreach на пару строк в моем запросе LINQ? Проблема в том, что у меня нет туманной идеи, как это сделать.Получение только верхней строки из каждой группы

var Result = 
from a in DB.Table1 
group new {Values = a} by a.Value1 into c 
select new {everything = c}; 

foreach (var Row in Result) 
{ 
    foreach (var RowAll in Row.Everything) 
     { 
     List.Add(new List<string>() {RowAll.Value1, RowAll.Value2}) 
     break; 
    } 
} 

ответ

1

Использование Enumerable.First:

var List = 
    (from Row in Result 
    let RowAll = row.Everything.First() 
    select new List<string>() {RowAll.Value1, RowAll.Value2} 
    ).ToList(); 

Или, в сочетании с оригинальным запросом:

var List = 
    (from a in DB.Table1 
    group a by a.Value1 into c 
    select new List<string>() {c.Key, c.First().Value2} 
    ).ToList(); 
0

Использование FirstOrDefault:

var query = from row in result 
      let rowAll = row.Everything.FirstOrDefault() 
      where rowAll != null 
      select new List<string> {rowAll.Value1, rowAll.Value2}; 

var list = query.ToList(); 

Перечитывая вы первый запрос я понял, вы гр ouping на свойстве 'a', поэтому не должно быть пустых группировок. First() должен быть безопасным, как на примере других плакатов.

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