[英]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.