linq-firstordefault()是否总是返回相同的记录?

pvabu6sv  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(386)

如果我有下面的“用户”表

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

以及以下linq查询:

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

结果总是一致的吗?
我总是得到用户名为“xyz”的用户或用户名为“pqr”的用户,还是随机的?

vxqlmq5t

vxqlmq5t1#

有点小题大做,是的, FirstOrDefault 将始终返回序列中的“第一个”项(如果没有项,则返回默认值)。可以改变的是 OrderByDescending . 你有两个相同的项目 UserId 值,因此当您请求按该值排序的项时,sql不能保证每次具有相同id的项的顺序都是相同的。

mctunoxg

mctunoxg2#

在这种情况下,它不会是随机的,在对具有重复userid的表users中的userid使用orderbydescending之后,另一个依赖列将以与在user表中相同的顺序出现在最终列表中。
如果这是table上的顺序

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

以及以下linq查询:

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

将给出输出:具有pqr的用户
希望这有帮助。

xzabzqsa

xzabzqsa3#

我在enumerable.orderby中阅读了以下内容
此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不保留具有相同键的元素的顺序。
因此,由于这是一个稳定的排序,ienumerable orderby的结果总是相同的。
但是,虽然你没有告诉我,因为你正在使用 _context.User ,我假设该表位于数据库管理系统中。结果取决于您的dbms。
queryable.orderby说:
由于执行表示调用orderby(iqueryable,expression>)的表达式树而发生的查询行为取决于源参数类型的实现。预期的行为是,它根据通过调用source的每个元素上的keyselector获得的键对source的元素进行排序。
要说对两个元素进行排序的结果取决于所使用的dbms,这是一种困难的方法。如果您想确定您总是有相同的排序结果,那么您必须按第二个元素排序,如果需要,则按第三个元素排序,直到您确定您是按唯一值排序。

bttbmeg0

bttbmeg04#

警告:我在这里假设 UserId 上的列 User 表是pkid并且是唯一的。
您正在发出一个有序查询,所以是的:它将始终返回 pqr 记录(显然,直到数据发生变化)。sql将类似于:

select top 1 *
from User
order by UserId desc

但是您可以通过检查sql跟踪来找出实际的sql。
如果你没有 OrderByDescending :没有任何保证。

相关问题