2 回答
TA贡献2041条经验 获得超4个赞
这实际上是一对一的翻译。
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转换,否则 EF Core 将尝试模拟 LINQMax方法抛出行为并评估查询客户端。
TA贡献1796条经验 获得超7个赞
当然,没有指标的 TimeInsertedLocal 值大于所有 Indicators 中 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();
- 2 回答
- 0 关注
- 146 浏览
添加回答
举报