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 生成相同的查询或获得相同结果的更好的查询?
这实际上是一对一的翻译。
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方法抛出行为并将评估查询客户端。