我今天遇到LINQ查询问题,经过一些调试后我能够解决问题,但这似乎是LINQ工作方式的错误。这就是我所拥有的:
var myitem = context
.items
.OrderByDescending(x => x.DateEdited)
.FirstOrDefault(x => x.fkId == myFkId && x.DateEdited < someDate);
在我的数据库中,我有一个包含一些记录的表,我想要检索比“someDate”更旧且在列中有特定外键的最新记录。但是上面的查询不起作用。它使用匹配的外键返回最旧的记录。我最终不得不像这样重写我的查询以使其工作:
var myitem = context
.items
.Where(x => x.fkId == myFkId && x.DateEdited < someDate)
.OrderByDescending(x => x.DateEdited)
.FirstOrDefault();
在我的调试中,我发现“x.DateEdited&lt; someDate”正在重新排序IEnumerable,所以我最终必须在日期检查后放置我的OrderByDescending子句。
还有其他人遇到过这个问题吗?这是一个错误还是预期的功能?
答案 0 :(得分:3)
即使.OrderByDescending()
返回IOrderedEnumerable
,.FirstOrDefault()
也是。Where()
的快捷方式,只返回IEnumerable
,但不保证订单。< / p>
基本上,添加过滤器并不能保证数据的顺序。如果从第一个查看生成的SQL,您将从orderby获得嵌套的子结果,然后再次进行过滤。
答案 1 :(得分:1)
通常,如果某个操作没有明确定义输出顺序,那么在您自己指定/应用它之前,不能依赖于任何特定顺序的结果。
除非您知道订购中间结果会在算法的下一步中提高性能,否则没有理由这样做。只需将订购作为最终处理步骤。