使用Linq To SQL选择具有最大聚合的记录

时间:2013-02-21 05:28:07

标签: c# .net linq-to-sql group-by linqpad

我有以下两个表:

DocumentType
    Id INT,
    Name VARCHAR(100),
    Active BIT,
    CreatedBy INT

Document
    Id INT,
    DocumentTypeId INT,
    Version SMALLINT,
    Text NTEXT

我想选择DocumentType和相关的Document记录,其中Version的值最大。我尝试了以下查询:

from t in Documents 
join tt in DocumentTypes on  t.DocumentTypeId equals tt.Id 
where tt.CreatedBy == 10
group t by t.DocumentTypeId into g
//let v = new {Version = g.Max( t => t.Version), TypeId =g.Key}
select new 
       {
           Key = g.Key, 
           Version = g.Max(t=>t.Version), 
           Text = t.Text //ERROR AT t.Text
       };

但它在下一行给我一个错误:

Text = t.Text

The name 't' does not exist in the current context

我也试过g.Text,但它没有帮助。请帮我修复此查询。我在LinqPad尝试这个。

3 个答案:

答案 0 :(得分:2)

您似乎需要检索具有相同Document的{​​{1}}实体,该实体具有DocumentType属性的最大值。无需按Version列进行分组。

分组后,您有一组文件。唯一剩下的就是为每个组获得一个最大ntext值。我按此属性按降序排序组,并获得第一个值:

Version

如果需要,您可以将结果from t in Documents join tt in DocumentTypes on t.DocumentTypeId equals tt.Id where tt.CreatedBy == 10 group t by t.DocumentTypeId into g select g.OrderByDescending(t => t.Version).FirstOrDefault(); 实体投影为匿名类型。

答案 1 :(得分:1)

尝试

from t in Documents 
join tt in DocumentTypes on  t.DocumentTypeId equals tt.Id 
where tt.CreatedBy == 10
orderby t.Version descending
group t by t.DocumentTypeId into g

select new 
    {
        Key      = g.Key, 
        Version  =  g.First().Version, 
        Text     =  g.First().Text 
    };

答案 2 :(得分:0)

t已经代表别的东西了 试试这种方式

Version = g.Max(x=>t.Version),