首页 > 解决方案 > 2 列中最新日期的 LINQ 匹配

问题描述

给出这个 Linq 查询:

GetData.Where(p => p.LastActionA >= startDate && p.LastActionA <= endDate)

我该如何更改它,以便匹配 2 个日期列中的最大值?

即类似的东西 GetData.Where(MAX(p.LastActionA, p.LastActionB) >= startDate

我可以获得的最接近的等效 SQL 使用子查询,如下所示:

SELECT ID,
  (SELECT MAX(v)  FROM (VALUES (LastActionA), (LastActionB)) AS value(v)) as MaxDate
FROM Data

标签: entity-frameworklinq-to-entitiesmax

解决方案


对于仅 2 个日期,您可以使用 C# 条件运算符(适用于最新的 EF6 和 EF Core):

.Where(p => (p.LastActionA > p.LastActionB ? p.LastActionA : p.LastActionB) >= startDate)

以下适用于 2 个或更多日期,但仅适用于 EF6(生成更差的 SQL)。实际上它也适用于 EF Core,但会导致客户端评估,这很糟糕:

.Where(p => new [] { p.LastActionA, p.LastActionB }.Max() >= startDate)

推荐阅读