微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

IQueryable的顺序是否保留在C#EF Core中的实际查询中?

如何解决IQueryable的顺序是否保留在C#EF Core中的实际查询中?

因此,当我为DbContext编写查询时,可查询对象的顺序实际上代表了输出查询。例如:

_dbContext
.Table
.OrderBy(i => i.Date)
.Take(25)
.Where(i => i.Variable == "something")
.ToList()

_dbContext
.Table
.Where(i => i.Variable == "something")
.OrderBy(i => i.Date)
.Take(25)
.ToList()

所以这些查询是不同的,因为第一个查询日期获取最后25个项目并执行where子句。但是另一个从where的结果中减去25。

在执行时会保持此顺序,还是像在其中设置并执行所有属性生成器一样。 如果我看普通的sql,则无法在同一查询中在TAKE之前先WHERE。所以这对我来说是没有道理的。


我感到困惑的原因是,如果我用MS sql编写第一个查询,我们将得到以下信息:

SELECT TOP 25 * FROM `Table` WHERE `Variable` = 'something' ORDER BY `Date`

其中where结果取25。

解决方法

如果启用日志记录SQL,您会发现这两个查询的顺序很重要

 SELECT [t].[Id],[t].[Date],[t].[Variable]
  FROM (
      SELECT TOP(@__p_0) [m].[Id],[m].[Date],[m].[Variable]
      FROM [MyObjects] AS [m]
      ORDER BY [m].[Date]
  ) AS [t]
  WHERE [t].[Variable] = N'something'
  ORDER BY [t].[Date]

SELECT TOP(@__p_0) [m].[Id],[m].[Variable]
      FROM [MyObjects] AS [m]
      WHERE [m].[Variable] = N'something'
      ORDER BY [m].[Date]

可以通过在appsettings.json中设置EntityFramework Core的日志级别来启用日志记录

{
  "Logging": {
    "LogLevel": {
      "Microsoft.EntityFrameworkCore": "Debug"
    }
  }
}

还需要确保您的数据库上下文具有此特定的构造函数重载

public AppDbContext(DbContextOptions options) : base(options)
{
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。