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

标签 c# linq entity-framework-core iqueryable

因此,当我为 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,我无法在同一查询中的 WHERE 之前进行 TAKE 。所以对我来说这是有道理的。


我感到困惑的原因是,如果我在 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].[Date], [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)
{
}

关于c# - IQueryable 的顺序是否保留在 C# EF Core 中的实际查询中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64537655/

相关文章:

c# - Entity Framework 核心——脚手架枚举

c# - 专门针对旧版本的单个 .NET Standard API/命名空间(Entity Framework Core)

c# - 将 JSON 的一部分替换为其他(使用字符串标记)

c# - 在 C# 中动态评估字符串条件

c# 一对多字符串解析帮助使用正则表达式 lambda

C# LINQ 如何将父列表和两个嵌套的子列表展平为一个新列表

c# - EF Core 6 中 entityEntry.Metadata.DefiningNavigationName() 的等效项是什么?

c# - 如何从 C# 调用 CICS 程序

c# - 如何在gridview中求和从asp.net数据库中选择数据

c# - 如何使用 xDocument 和 Linq 选择元素的孙元素