agr*_*gri 6 c# sql linq linq-to-entities
我有一个 sql 查询,我先 group byName
然后 order by Date
。我还需要为每组选择一个具有最新日期的条目。我如何在 linq 中做到这一点(使用 lambda 表达式)?
select Name,Date,Comment
from Feedback
Group by Name,Date,Comment
order by Date desc
Run Code Online (Sandbox Code Playgroud)
我的林克
var query= db.Feedback
.GroupBy(f => f.Name, (f, g) => new
{
Name = f,
Comment = g.Select(h => h.Comment),
Date= g.Select(h => h.Date)
})
.Select(f => new { f.Name, f.Date, f.Comment}).ToList();
Run Code Online (Sandbox Code Playgroud)
如何按Date
desc 对每个组进行排序并获取第一个条目?
编辑
我已将我的查询更新为
var query= db.Feedback.GroupBy(f => new { f.Name, f.Comment })
.Select(a => a.AsEnumerable())
.Select(b => b.OrderByDescending(f => f.Date)
.Select(c=>new{c.Name,c.Date,c.Comment}));
Run Code Online (Sandbox Code Playgroud)
...并且执行最后一个 Select 可以防止 JsonSerializer 中出现引用循环错误。
我的数据应该是这样的
姓名:Name1 日期:9 月 28 日 评论:评论文本
姓名:Name2 日期:8 月 15 日 评论:评论文本
...但看起来是这样的:
姓名:Name1 日期:9 月 28 日 评论:评论文本
姓名:Name2 日期:8 月 15 日 评论:评论文本
姓名:Name1 日期:8 月 1 日 评论:评论文本
...这是解决方案
var query= db.Feedback
.GroupBy(f => new { f.Name})
.Select(a => a.AsEnumerable())
.Select(b => b.OrderByDescending(f => f.Date)
.Select(c => new { c.Name, c.Date, c.Comment})
.FirstOrDefault());
Run Code Online (Sandbox Code Playgroud)
您的查询将是:
var query= from f in db.Feedback
group f by new {f.Name, f.Date, f.Comment} into g
orderby g.Key.Date descending
select new {g.Key.Name, g.Key.Date, g.Key.Comment};
Run Code Online (Sandbox Code Playgroud)
还:
var query= from f in db.Feedback
group f by new {f.Name, f.Date, f.Comment} into g
orderby g.Key.Date descending
select g.Key;
Run Code Online (Sandbox Code Playgroud)
如果您想要第一个元素,请使用FirstOrDefault
扩展方法:
var first= query.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
如果您希望每个组的第一个元素按Date
then 排序,您也可以这样做:
var query= from f in db.Feedback
group f by new {f.Name, f.Date, f.Comment} into g
select g.OrderByDescending(e=>e.Date).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
如果您只想按名称分组,请执行以下操作:
var query= from f in db.Feedback
group f by f.Name into g
select g.OrderByDescending(e=>e.Date).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)
您不能先申请GroupBy
,然后再OrderBy
在日期栏上申请。因为如果你有它,GroupBy
它只会给你每组中一个日期值。因此,如果您想按日期排序,您应该将其从分组依据中删除并使用:
var q = db.Feedback
.GroupBy(f => new {f.Name, f.Comment})
.Select( a => a.AsEnumerable())
.Select(b=> b.OrderByDescending(f => f.Date))
;
foreach (var item in q)
{
Debug.Log(item.FirstOrDefault().ToString());
}
Run Code Online (Sandbox Code Playgroud)