繁体   English   中英

在 LINQ 中进行分区的最佳方法

[英]Best way to partition in LINQ

考虑这样的表

ID 日期
1 2022 年 7 月 30 日
1 29/07/2022
1 28/07/2022
2 15/07/2022
3 15/07/2022
3 2022 年 7 月 14 日

你如何编写一个 linq 查询来获得这个结果? (当然是在一个查询中,并且没有任何循环)

ID 日期
1 2022 年 7 月 30 日
2 15/07/2022
3 15/07/2022

或者要清楚地指定它,最接近的日期通过 Id

用 SQL 编写它很容易,但我在 LINQ 中找不到令人满意的方法

var result = table
    .GroupBy(t => t.Id)
    .Select(t => new { Id = t.Key, Date = t.Max(o => o.Date)})
    .ToList();

Thera 是我知道的方式,如果您需要表格中的所有字段,而不仅仅是日期。

EF 6 和 EF Core 6 +

var query = 
    from c in db.Some
    group c by new { c.Id } into g
    select g.OrderByDescending(c => c.Date).First();

其他版本,可能还有其他提供商

// make common variable because it may be query with filter
var data = db.Some;

var query = 
    from d in data.Select(d => new { d.Id }).Distinct()
    from c in data
        .Where(c => c.Id == d.Id)
        .OrderByDescending(c => c.Date)
        .Take(1)
    select c;

通过linq2db 的最快变体

var query = 
    from c in db.Some
    select new 
    {
        c,
        RN = Sql.Ext.RowNumber().Over()
            .PartitionBy(c.Id)
            .OrderByDesc(c.Date)
            .ToValue()
    } into s
    where s.RN == 1
    select s.c;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM