Linq Group by和

时间:2016-09-28 14:41:34

标签: c# sql linq linq-to-entities

我有一个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());

2 个答案:

答案 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();