2010-06-28 66 views
1

我有一些代码按“Value1”对表进行分组,并将一些循环将每个组的顶部行添加到列表中。这是一个非常丑陋的方式来做到这一点,我想知道如果我可以在我的LINQ查询中用几行代替一个foreach循环吗?问题是,我不知道如何做到这一点。获取每个组的顶部行

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(); 

重读你的第一个查询我意识到你是GR ouping'a'的财产,所以不应该有空的分组。 First()应该像其他海报示例一样安全。