没有“OrderBy”运算符的实体框架核心 5.0 警告限制运算符(“跳过”/“接受”)

Jor*_*byn 3 c# entity-framework-core asp.net-core

我正在编写一个 .net Core 3.1 应用程序,最近将其更新为 Entity Framework Core 5.0。此后运行应用程序开始显示警告,如下所示:

该查询使用行限制运算符 ('Skip'/'Take') 而没有 'OrderBy' 运算符。这可能会导致不可预测的结果。

我已经查看了我的代码的每个实例,这些实例将使用 .Skip 或 .Take 或两者,并且它们都有一个 OrderBy 子句。

我的问题是,有没有我可以设置的标志

DbContextOptionsnBuilder() .ConfigureWarnings(w => w.Throw(RelationalEventId.???))

帮助确定这些 .Skip 和 .Take 查询正在运行的位置,或者以任何方式触发带有此警告的堆栈跟踪以缩小原因。

或者,如何从控制台消除此警告?

Iva*_*oev 7

EventId您正在寻找的值为CoreEventId.RowLimitingOperationWithoutOrderByWarning.

查询使用没有 OrderBy 的行限制操作 (Skip/Take),这可能会导致不可预测的结果。

此事件位于DbLoggerCategory.Query类别中。

和往常一样,默认操作是Log,您可以将其转为错误

.Throw(CoreEventId.RowLimitingOperationWithoutOrderByWarning)
Run Code Online (Sandbox Code Playgroud)

或压制它

.Ignore(CoreEventId.RowLimitingOperationWithoutOrderByWarning)
Run Code Online (Sandbox Code Playgroud)


小智 5

事实上,即使您在主键选择上使用FirstOrDefault(或SingleOrDefault),您也会收到此警告,即

context.dbsetXXX.SingleOrDefaultAsync(xxx => xxx.ID == id);
Run Code Online (Sandbox Code Playgroud)

这似乎是由于此查询如何在 T-SQL 中错误地映射 - 使用TAKE(1)语句。所以现在我只会忽略警告(使用.Ignore(CoreEventId.RowLimitingOperationWithoutOrderByWarning) ...

  • 查询拆分功能会出现相同的警告:https://github.com/dotnet/efcore/issues/22579 (3认同)