Linq 分组依据和排序依据

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)

如何按Datedesc 对每个组进行排序并获取第一个条目?

编辑

我已将我的查询更新为

    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)

oct*_*ccl 6

您的查询将是:

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)

如果您希望每个组的第一个元素按Datethen 排序,您也可以这样做:

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)


Uma*_*r M 3

您不能先申请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)