我有一张表格,结构如下(且包含样本数据):
我需要获取每个(非唯一)标识符的最新条目,但每个标识符最多只能获取一条。
似乎可以解决我的问题的 MariaDB SQL 查询如下:
并且
标识符 | 使用日期 | 零件编号 |
---|---|---|
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 |
似乎可以解决我的问题的 MariaDB SQL 查询如下:
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' 模式。在对其进行客户端评估之前,调用 'AsEnumerable'."
第二个实质上产生了相同的结果,只是抱怨LINQ表达式而不是GroupBy。
我想避免使用原始SQL,但该如何正确(且希望高效地)实现这一点?