如何将此 SQL 查询转换为 EF Core 中的 LINQ 查询?

Ond*_*tai 2 c# sql linq entity-framework-core

我有下表:

Indicators(A INT, B INT, C INT, D INT, TimeInsertedLocal DateTime) . 
Run Code Online (Sandbox Code Playgroud)

我有映射到此表的 EF Core 映射实体。

我需要将此 SQL 查询转换为 ef core Linq 等效查询。

SELECT A, B, C, D, TimeInsertedLocal
FROM Indicators
WHERE TimeInsertedLocal >= 
(   
    SELECT MAX(I.TimeInsertedLocal) 
    FROM Indicators AS I
) 
Run Code Online (Sandbox Code Playgroud)

这是实体:

public class Indicator
{
    public int A { get; set; }
    public int B { get; set; }
    public int C { get; set; }
    public int D { get; set; }
    public DateTime TimeInsertedLocal { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

如何编写 LINQ 查询,以便 EF Core 生成相同的查询或获得相同结果的更好的查询?

Iva*_*oev 5

这实际上是一对一的翻译。

SQL查询

SELECT A, B, C, D , TimeInsertedLocal
FROM Indicators
WHERE TimeInsertedLocal >= 
(   
    SELECT MAX(I.TimeInsertedLocal) 
    FROM Indicators AS I
)
Run Code Online (Sandbox Code Playgroud)

EF Core LINQ 查询:

var indicators = dbContext.Set<Indicator>();
var query = indicators
    .Where(i => i.TimeInsertedLocal >= indicators.Max(i2 => (DateTime?)i2.TimeInsertedLocal));
Run Code Online (Sandbox Code Playgroud)

EF Core 生成的 SQL 查询:

SELECT [i].[A], [i].[B], [i].[C], [i].[D], [i].[TimeInsertedLocal]
FROM [Indicators] AS [i]
WHERE [i].[TimeInsertedLocal] >= (
    SELECT MAX([i2].[TimeInsertedLocal])
    FROM [Indicators] AS [i2]
)
Run Code Online (Sandbox Code Playgroud)

LINQ 查询中唯一的具体细节是DateTime?内部的强制转换Max,否则 EF Core 将尝试模拟 LINQMax方法抛出行为并将评估查询客户端