LINQ - FirstOrDefault()是否总是返回相同的记录?

问题描述 投票:0回答:1

如果我有以下'用户'表

UserName UserID
-------- ------
abc      1
xyz      2
pqr      2

和下面的linq查询。

_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();

结果总是一致的吗?

就像我总是得到UserName为'xyz'的用户或UserName为'pqr'的用户,还是随机的?

c# sql entity-framework linq linq-to-entities
1个回答
2
投票

说得有点尖酸刻薄,没错。FirstOrDefault始终 返回序列中的 "第一个 "项目(如果没有项目,则返回默认值)。什么是 可以 变化是由 OrderByDescending. 你有两个相同的项目 UserId 值,所以当你要求按该值排序的项目时,SQL不能保证每次具有相同ID的项目的顺序都是相同的。


0
投票

在这种情况下,它不会是随机的,在从表Users中对UserID使用OrderByDescending后,其他依赖列将以与User表中相同的顺序出现在最终列表中。

例如:如果这是在表中的顺序。

UserName UserID
-------- ------
abc      1
pqr      2
xyz      2

和下面的linq查询。

_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();

将给出输出:用户与pqr

希望能帮到你。


0
投票

我读到以下内容 Enumerable.OrderBy

这种方法执行的是稳定排序;也就是说,如果两个元素的键相等,则元素的顺序会被保留。相反,不稳定的排序不会保留具有相同键的元素的顺序。

所以,由于这是一个稳定的排序,所以IEnumerable OrderBy的结果总是相同的。

然而,虽然你没有这么说,但因为你使用的是 _context.User我假设该表是在一个数据库管理系统中。结果取决于你的DBMS。

Queryable.OrderBy 说。

执行表示调用OrderBy(IQueryable, Expression>)的表达式树的结果所发生的查询行为,取决于源参数类型的实现。预期的行为是,它根据在源的每个元素上调用keySelector得到的键对源的元素进行排序。

这是一种很难说的方式,两个元素的排序结果取决于你使用的DBMS。如果你想确定你的排序结果总是一样的,你就必须对第2个元素进行ThenBy排序,如果需要的话,还要对第3个元素进行排序,直到你确定你是在唯一的值上进行排序。


-3
投票

注意:我在这里假设的是 UserId 栏上 User 表是一个PKID,并且是唯一的。

你发出的是一个有序的查询,所以是的:它总是会回到 pqr 记录(显然,直到数据发生变化)。SQL将是这样的。

select top 1 *
from User
order by UserId desc

但你可以找出 实际 通过SQL跟踪检查SQL。

如果你没有 OrderByDescending:没有任何保障。

© www.soinside.com 2019 - 2024. All rights reserved.