选择linq中column1和order by column2的所有不同的最后记录(不相应地工作)

9rnv2umw  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(299)

所以我有一张这样的table:

现在我想清楚了 ShortCode 按订单 ID 下降。换句话说,不同的最后记录。这样地:

所以我尝试了群比,比如:

var data = db.ShortCodes.GroupBy(x => x.ShortCode).Select(x => x.FirstOrDefault()).OrderByDescending(s=> s.ID);

这给了我不同的记录,但不是最后的记录,也不是按id降序排列的:

我也试过了

var data = db.ShortCodeManager
               .GroupBy(s => s. ShortCode)
               .Select(g => g.First())
               .OrderByDescending(s => s.ID);

这给了我一个错误 The method 'First' can only be used as a final query operation. Consider using the method 'FirstOrDefault' in this instance instead. 所以我改成 FirstOrDefault() 比如:

var data = db.ShortCodeManager
               .GroupBy(s => s. ShortCode)
               .Select(g => g.FirstOrDefault())
               .OrderByDescending(s => s.ID);

这也给了我不同的记录,但不是最后的记录:

所以最后我试着像这里建议的那样:

var data = db.ShortCodeManager.Where(a => a.ID > 0).GroupBy(x => x.ShortCode).OrderByDescending(grp => grp.Max(g => g.ID)).Select(a => a.FirstOrDefault());

同样,这给了我不同的记录,但不是最后的记录,也不是按id降序排列的:

那么,如何编写查询以在linq中获得所需的结果呢?还要注意的是,我需要更多的不同的最后一个记录,而不是排序方式 ID 下降。如果有人也知道如何用原始sql编写它,那么它可能也很有用。

lf5gs5x2

lf5gs5x21#

此linq查询应适用于您的案例:

var result = db.ShortCodeManager
    .GroupBy(x => x.ShortCode)
    .Select(gr => new { Id = gr.Max(g => g.Id), ShortCode = gr.Key})
    .ToList();

编辑:
根据你的评论,看起来你需要抛出匿名对象 resultShortCodeManagerModel 键入,然后将其传递给视图。所以,像这样的事情:

var result = db.ShortCodeManager
    .GroupBy(x => x.ShortCode)
    .Select(gr => new { Id = gr.Max(g => g.Id), ShortCode = gr.Key})
    .ToList();

var model = result 
    .Select(x => new ShortCodeManagerModel { Id = x.Id, ShortCode = x.ShortCode })
    .ToList();

然后通过 model 给你看。

相关问题