【发布时间】:2018-06-13 19:03:27
【问题描述】:
我的问题比较笼统,但我有一个例子可以帮助说明:
db.aTable.Where(x => x.Date < someDateInThePast).OrderByDescending(x => x.Date).First()
这给了我一个项目,它与此命令返回的项目不同:
db.aTable.Where(x => x.Date < someDateInThePast).ToList().OrderByDescending(x => x.Date).First()
(注意中间的“ToList()”)。
据我所见,第一个示例中实际发生的情况是 OrderBy 完全无视 .Where() 完成的过滤。它正在订购整个aTable。
第二个查询给出了实际正确的项目。
.Date 参数是一个 DateTime 类型(在 SQL 端它是一个“日期时间”)。
LINQ to Entities 会出现这种行为吗?
【问题讨论】:
-
可能你有几个具有相同最大值
Date的项目,并且在数据库和客户端上订购从它们中选择不同的一个结果。您可以添加额外的排序,例如:.OrderByDescending(x => x.Date).ThenBy(x => x.Id)以确保相同的结果。 -
我的实际 LINQ 在 .Where() 中包含一个附加部分,该部分按 ID 过滤,每个 ID 每个日期最多有 1 个条目。无论如何我已经检查过了,对于第一个查询,我得到了一个日期为 27/11/2017 的项目。而第二个给出了 2018 年 3 月 15 日正确的最新一个。它几乎看起来像是在对原始字符进行排序(例如 27 > 15),但我无法证明它
-
这是一个奇怪的问题,它甚至不是一个真正的问题,因为它不可能重现你的结果来回答。您需要创建一个最小示例、一个包含最少列和类型定义的表描述以及一些重现您的问题的示例数据。您还需要告诉我们您使用的是什么数据库。因为它不可能知道你看到了什么或为什么
-
添加 ToList() 应该不会对 O/P 产生任何影响,但是正如 TheGeneral 所说,您需要使用 i/p 扩展代码以便其他人交叉验证一次
-
什么是你的第一种方法生成的 sql 查询,你能检查一下吗