可能的linq bug /问题

时间:2011-02-21 17:26:52

标签: asp.net linq linq-to-sql

我今天遇到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子句。

还有其他人遇到过这个问题吗?这是一个错误还是预期的功能?

2 个答案:

答案 0 :(得分:3)

即使.OrderByDescending()返回IOrderedEnumerable.FirstOrDefault()也是。Where()的快捷方式,只返回IEnumerable,但不保证订单。< / p>

基本上,添加过滤器并不能保证数据的顺序。如果从第一个查看生成的SQL,您将从orderby获得嵌套的子结果,然后再次进行过滤。

答案 1 :(得分:1)

通常,如果某个操作没有明确定义输出顺序,那么在您自己指定/应用它之前,不能依赖于任何特定顺序的结果。

除非您知道订购中间结果会在算法的下一步中提高性能,否则没有理由这样做。只需将订购作为最终处理步骤。