C#加入群组查询

时间:2018-02-14 13:15:25

标签: c# linq-to-sql

我正在使用此查询:

var result =
    from i in dc.TFFiles                    
    where i.Tid == tid                    
    group i by new { i.Title, i.Type } into gr
    join c in dc.FCategories on gr.FirstOrDefault().CatId equals c.Id
       select new { id = gr.FirstOrDefault().id, Title = gr.FirstOrDefault().Title, Version = (from cv in gr select cv.Version).Max() };

但如果有这些TFFiles:

   id   |   tid   |   Title    |   Type   |    Version
    0   |    15   |  File1     |   Type1  |      0
    1   |    15   |  File2     |   Type1  |      0
    2   |    15   |  File1     |   Type1  |      1
    3   |    15   |  File1     |   Type1  |      2

我会回来的:

   id   |   tid   |   Title    |   Type   |    Version
    0   |    15   |  File1     |   Type1  |      2 (wrong version - id)
    1   |    15   |  File2     |   Type1  |      0

而不是:

   id   |   tid   |   Title    |   Type   |    Version
    3   |    15   |  File1     |   Type1  |      2 (correct version - id)
    1   |    15   |  File2     |   Type1  |      0

如何更改查询以获得正确的结果?

1 个答案:

答案 0 :(得分:1)

我在评论中的第一个建议是获取最大ID,但这可能会返回错误的ID。

第二个建议是使用以下内容:

id = gr.OrderByDescending(item => item.Version).FirstOrDefault().id

将使用降序排序从具有最高版本的组中获取id。

还有一件事:如果只有id不同的记录相同,那么返回的id可能不是最后一个。假设这不是问题。