所以我有张这样的桌子:
现在,我需要由ShortCode
降序的不同的ID
顺序。换句话说,不同的最后记录。如下所示:
所以我试了一下GroupBy:
var data = db.ShortCodes.GroupBy(x => x.ShortCode).Select(x => x.FirstOrDefault()).OrderByDescending(s=> s.ID);
这给了我独特的记录,但不是最后的记录,也不是由ID降序的:
现在我也尝试了像建议的here
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);
这也给了我独特的记录,但没有给我最后的记录:
所以我终于像建议的那样尝试了here
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编写它,那么它也可能是有用的。
发布于 2020-08-04 06:00:02
这个LINQ查询应该适用于您的情况:
var result = db.ShortCodeManager
.GroupBy(x => x.ShortCode)
.Select(gr => new { Id = gr.Max(g => g.Id), ShortCode = gr.Key})
.ToList();
编辑:
根据您的注释,您需要将匿名对象result
转换为ShortCodeManagerModel
类型,然后将其传递给您的视图。所以,就像这样:
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
传递给您的视图。
https://stackoverflow.com/questions/63248372
复制