对Linq GroupBy和Max的SQL查询

时间:2010-02-09 23:04:12

标签: c# linq linq-to-sql

这是我想要转换为Linq的SQL查询。我正在使用通用的对象列表,而不是DataTable,如果这是相关的。

Select Max(Date), ID, Property1, Peroperty2 From List Group By ID

请帮忙。

2 个答案:

答案 0 :(得分:4)

虽然您的SQL无效,Property1Property2必须是您的聚合的一部分,但这将按ID,Property1,然后依次按Property2分组,这是我认为您正在寻找的:

from obj in List
group obj by new {obj.ID, obj.Property1, obj.Property2 } into g
select new 
       { 
          ID = g.Key.ID, 
          Property1 = g.Key.Property1, 
          Property2 = g.Key.Property2,  
          MaxDate = g.Max(p => p.Date) 
       }

相当于:

Select Max(Date), ID, Property1, Peroperty2 
From List 
Group By ID, Property1, Property2

答案 1 :(得分:1)

正如Steve所说,如果没有Property1等,你的SQL在聚合子句中是无效的。但是,在我看来,你试图获取那些'行'的数据,其中日期等于Id''行'组的最大日期?

这就是这样的:

recs.GroupBy(r => r.Id).SelectMany(g => g.Where(r => r.Date == g.Max(a => a.Date)))

按ID分组,获取日期与该组的最大日期匹配的项目的IEnumeration,并将它们展平为单个IEnumeration - 然后可以迭代或任何您想要的。

编辑:顺便说一句,在查询语法中,我能做的最好的事情(花了我一段时间......)就像是:

from r in recs
where r.Date ==
    (from sr in recs
     where sr.Id == r.Id
     select sr.Date).Max()
select r;

编辑2:

实际上更像是:

recs.Where(r => r.Date == recs.Where(sr => sr.Id == r.Id).Max(a => a.Date)).Select(r => r)

用流畅的语法,这对我来说并不像我做的第一种方式那样好......我真的不喜欢查询表达式语法,这很有趣因为我很放心使用SQL和查询语法更喜欢SQL。