为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
千巷猫影 2022-12-24 14:33:28
我有下表:Indicators(A INT, B INT, C INT, D INT, TimeInsertedLocal DateTime) . 我有映射到此表的 EF Core 映射实体。我需要将此 SQL 查询转换为 ef core Linq 等效查询。SELECT A, B, C, D, TimeInsertedLocalFROM IndicatorsWHERE 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 生成相同的查询或获得相同结果的更好的查询?
查看完整描述

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方法抛出行为并评估查询客户端。


查看完整回答
反对 回复 2022-12-24
?
芜湖不芜

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();


查看完整回答
反对 回复 2022-12-24
  • 2 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信