问题描述
因此,当我为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)
{
}