如果我有以下'用户'表
UserName UserID
-------- ------
abc 1
xyz 2
pqr 2
和下面的linq查询。
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
结果总是一致的吗?
就像我总是得到UserName为'xyz'的用户或UserName为'pqr'的用户,还是随机的?
说得有点尖酸刻薄,没错。FirstOrDefault
会 始终 返回序列中的 "第一个 "项目(如果没有项目,则返回默认值)。什么是 可以 变化是由 OrderByDescending
. 你有两个相同的项目 UserId
值,所以当你要求按该值排序的项目时,SQL不能保证每次具有相同ID的项目的顺序都是相同的。
在这种情况下,它不会是随机的,在从表Users中对UserID使用OrderByDescending后,其他依赖列将以与User表中相同的顺序出现在最终列表中。
例如:如果这是在表中的顺序。
UserName UserID
-------- ------
abc 1
pqr 2
xyz 2
和下面的linq查询。
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
将给出输出:用户与pqr
希望能帮到你。
我读到以下内容 Enumerable.OrderBy
这种方法执行的是稳定排序;也就是说,如果两个元素的键相等,则元素的顺序会被保留。相反,不稳定的排序不会保留具有相同键的元素的顺序。
所以,由于这是一个稳定的排序,所以IEnumerable OrderBy的结果总是相同的。
然而,虽然你没有这么说,但因为你使用的是 _context.User
我假设该表是在一个数据库管理系统中。结果取决于你的DBMS。
执行表示调用OrderBy(IQueryable, Expression>)的表达式树的结果所发生的查询行为,取决于源参数类型的实现。预期的行为是,它根据在源的每个元素上调用keySelector得到的键对源的元素进行排序。
这是一种很难说的方式,两个元素的排序结果取决于你使用的DBMS。如果你想确定你的排序结果总是一样的,你就必须对第2个元素进行ThenBy排序,如果需要的话,还要对第3个元素进行排序,直到你确定你是在唯一的值上进行排序。
注意:我在这里假设的是 UserId
栏上 User
表是一个PKID,并且是唯一的。
你发出的是一个有序的查询,所以是的:它总是会回到 pqr
记录(显然,直到数据发生变化)。SQL将是这样的。
select top 1 *
from User
order by UserId desc
但你可以找出 实际 通过SQL跟踪检查SQL。
如果你没有 OrderByDescending
:没有任何保障。