【发布时间】:2021-11-16 13:57:52
【问题描述】:
我有一个具有以下结构(和示例数据)的表:
| Identifier | UseDate | PartId |
|---|---|---|
| a123 | 05/01/2000 | 237 |
| a123 | 05/01/2000 | 4656 |
| a123 | 01/01/2000 | 2134 |
| a124 | 04/01/2000 | 5234 |
| a124 | 01/01/2000 | 2890 |
我需要获取每个(非唯一)标识符的最新条目,但每个标识符最多一个。
似乎可以解决我的问题的 SQL 查询(MariaDB)如下:
SELECT a.Identifier, a.MaxDate, b.PartId, b.UseDate
FROM
(SELECT Identifier, MAX(UseDate) AS MaxDate FROM MyTable GROUP BY Identifier) a
LEFT JOIN MyTable b ON a.Identifier = b.Identifier
WHERE a.MaxDate = b.UseDate GROUP BY a.Identifier;
但是我需要它来使用 C# 和 EF Core (Pomelo.EntitiFrameworkCore.MySql 5.0.3),我的尝试是:
var q1 = db.MyTable
.GroupBy(t => t.Identifier)
.Select(t => new { Identifier = t.Key, MaxDate = t.Max(x => x.UseDate) });
return new ObjectResult(db.MyTable
.Join(
q1,
t1 => t1.Identifier,
t2 => t2.Identifier,
(t1, t2) => new { Identifier = t2.Identifier, PartId = t1.PartId, MaxDate = t1.MaxDate, UseDate = t1.UseDate })
.Where(t => t.UseDate == q1.First(x => x.Identifier == t.Identifier).MaxDate)
.GroupBy(t => t.Identifier)
.ToList()
);
和
return new ObjectResult(db.MyTable
.GroupBy(t => t.Identifier)
.Select(t => t.OrderByDescending(x => x.UseDate).FirstOrDefault())
.ToList()
);
第一个抛出这个错误:
System.InvalidOperationException:“无法翻译给定的 'GroupBy' 模式。在 'GroupBy' 之前调用 'AsEnumerable' 以在客户端对其进行评估。”
第二个基本上产生相同的结果,只是抱怨 LINQ 表达式而不是 GroupBy。
我想避免使用原始 SQL,但如何正确(并希望有效地)实现它?
【问题讨论】:
-
您的目标是哪个 EFC 版本?
-
我正在使用 Pomelo.EntityFrameworkCore.MySql 5.0.3。
标签: c# sql entity-framework-core