我有一个SQL查询,我按Name
分组,然后按Date
排序。
我还需要为每个组选择一个具有最新日期的条目。
我如何在linq中使用(使用lambda表达式)?
select Name,Date,Comment
from Feedback
Group by Name,Date,Comment
order by Date desc
我的linq
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();
如何按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}));
...并且执行最后一次选择可防止在JsonSerializer中出现引用循环错误。
我的数据应如下所示
名称:名称1 日期:9月28日 评论:评论文字
名称:名称2 日期:8月15日 评论:评论文字
...但它看起来像是:
名称:名称1 日期:9月28日 评论:评论文字
名称:名称2 日期:8月15日 评论:评论文字
名称:名称1 日期: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());
答案 0 :(得分:3)
您无法在“日期”列中应用@Echo Off
Echo= Enter IP address of the CSR on the site.
Echo= Example: 11.152.34.82
Set/P "IPA= "
Call :Sub %IPA:.= %
Rem Your commands using new %IPA% here:
Echo= Your new IP address is %IPA%
Pause
Exit/B
:Sub
ClS
If %4 Gtr 19 Set/A LO=%4-19
Set "IPA=%1.%2.%3.%LO%"
,然后再应用GroupBy
。因为如果你在OrderBy
中拥有它,它将在每组中只给你一个日期值。因此,如果您想按日期订购,则应将其从group by中删除并使用:
GroupBy
答案 1 :(得分:2)
您的查询将是:
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};
此外:
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;
如果你想要第一个元素,请使用FirstOrDefault
扩展方法:
var first= query.FirstOrDefault();
如果您想要按Date
排序的每个组的第一个元素,那么您也可以这样做:
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();
如果您只想按名称分组,请执行以下操作:
var query= from f in db.Feedback
group f by f.Name into g
select g.OrderByDescending(e=>e.Date).FirstOrDefault();