我正在编写一个.net Core 3.1应用程序,最近已将其更新为Entity Framework Core 5.0。运行应用程序后开始显示以下警告:
查询使用不带"OrderBy"运算符。这可能会导致不可预测的结果。
我已经查看了我的代码中使用.Skip或.Take或两者的每个实例,它们都有OrderBy子句。
我的问题是,有什么标志我可以设置
DbContextOptiosnBuilder((.ConfigureWarnings(w=>w.Throw(RelationalEventId??(
以帮助确定这些.Skip和.Take查询正在运行的位置,或者以任何方式触发带有此警告的堆栈跟踪以缩小原因。
或者,如何才能从控制台上消除此警告?
事实上,即使在主键选择(即(上使用FirstOrDefault
(或SingleOrDefault
(,也会收到此警告
context.dbsetXXX.SingleOrDefaultAsync(xxx => xxx.ID == id);
这似乎是由于该查询在T-SQL中的映射不正确——使用了TAKE(1)
语句。所以现在我只是忽略警告(使用.Ignore(CoreEventId.RowLimitingOperationWithoutOrderByWarning) ...
(
您要查找的EventId
值是CoreEventId.RowLimitingOperationWithoutOrderByWarning
。
查询在没有OrderBy的情况下使用行限制操作(Skip/Take(,这可能会导致不可预测的结果。
此事件属于DbLoggerCategory.Query类别。
像往常一样,默认操作是Log
,您可以将其转换为错误
.Throw(CoreEventId.RowLimitingOperationWithoutOrderByWarning)
或抑制
.Ignore(CoreEventId.RowLimitingOperationWithoutOrderByWarning)
请记住,OrderBy/OrderByDescending方法应该在Skip/Take之前调用,这样结果就不会被分页