[英]How to translate this SQL query to a LINQ query in EF Core?
我有下表:
Indicators(A INT, B INT, C INT, D INT, TimeInsertedLocal DateTime) .
而且我有EF Core映射实体可以映射到该表。
我需要将此SQL查询转换为ef核心Linq等效查询。
SELECT A, B, C, D, TimeInsertedLocal
FROM Indicators
WHERE TimeInsertedLocal >=
(
SELECT MAX(I.TimeInsertedLocal)
FROM Indicators AS I
)
这是实体:
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; }
}
如何编写LINQ查询,以便EF Core生成相同的查询或达到相同结果的更好查询?
从字面上看,这是一对一的翻译。
SQL查询
SELECT A, B, C, D , TimeInsertedLocal
FROM Indicators
WHERE TimeInsertedLocal >=
(
SELECT MAX(I.TimeInsertedLocal)
FROM Indicators AS I
)
EF Core LINQ查询:
var indicators = dbContext.Set<Indicator>();
var query = indicators
.Where(i => i.TimeInsertedLocal >= indicators.Max(i2 => (DateTime?)i2.TimeInsertedLocal));
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]
)
LINQ查询中唯一的特定细节是DateTime?
在Max
内部Max
,否则EF Core将尝试模拟LINQ Max
方法的抛出行为,并评估查询客户端 。
当然,没有指标的TimeInsertedLocal值大于所有指标中的TimeInsertedLocal最大值。
但是,可能有几个指标的值等于TimeInsertedLocal的最大值。
在这种情况下,您需要将具有相同TimeInsertedLocal的指标组组成,并取最大的组。
var indicatorsWithLargestTimeInsertedLocal = myDbContext.Indicators
// make groups of Indicators with same TimeInsertedLocal:
.GroupBy(indicator => indicator.TimeInsertedLocal)
// put the group with the largest TimeInsertedLocal first:
.OrderByDescending(group => group.Key)
// The first group of indicators, is the group with the largest value of TimeInsertedLocal
.FirstOrDefault();
如果您确定TimeInsertedLocal是唯一的,则不必使用GroupBy,只有一个指标具有最大的TimeInsertedLocal
var indicatorWithLargestTimeInsertedLocal = myDbContext.Indicators
.OrderByDescending(indicator => indicator.TimeInsertedLocal)
.FirstOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.