如果我有下面的“用户”表
UserName UserID
-------- ------
abc 1
xyz 2
pqr 2
以及以下linq查询:
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
结果总是一致的吗?
我总是得到用户名为“xyz”的用户或用户名为“pqr”的用户,还是随机的?
如果我有下面的“用户”表
UserName UserID
-------- ------
abc 1
xyz 2
pqr 2
以及以下linq查询:
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
结果总是一致的吗?
我总是得到用户名为“xyz”的用户或用户名为“pqr”的用户,还是随机的?
4条答案
按热度按时间vxqlmq5t1#
有点小题大做,是的,
FirstOrDefault
将始终返回序列中的“第一个”项(如果没有项,则返回默认值)。可以改变的是OrderByDescending
. 你有两个相同的项目UserId
值,因此当您请求按该值排序的项时,sql不能保证每次具有相同id的项的顺序都是相同的。mctunoxg2#
在这种情况下,它不会是随机的,在对具有重复userid的表users中的userid使用orderbydescending之后,另一个依赖列将以与在user表中相同的顺序出现在最终列表中。
如果这是table上的顺序
以及以下linq查询:
将给出输出:具有pqr的用户
希望这有帮助。
xzabzqsa3#
我在enumerable.orderby中阅读了以下内容
此方法执行稳定排序;也就是说,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不保留具有相同键的元素的顺序。
因此,由于这是一个稳定的排序,ienumerable orderby的结果总是相同的。
但是,虽然你没有告诉我,因为你正在使用
_context.User
,我假设该表位于数据库管理系统中。结果取决于您的dbms。queryable.orderby说:
由于执行表示调用orderby(iqueryable,expression>)的表达式树而发生的查询行为取决于源参数类型的实现。预期的行为是,它根据通过调用source的每个元素上的keyselector获得的键对source的元素进行排序。
要说对两个元素进行排序的结果取决于所使用的dbms,这是一种困难的方法。如果您想确定您总是有相同的排序结果,那么您必须按第二个元素排序,如果需要,则按第三个元素排序,直到您确定您是按唯一值排序。
bttbmeg04#
警告:我在这里假设
UserId
上的列User
表是pkid并且是唯一的。您正在发出一个有序查询,所以是的:它将始终返回
pqr
记录(显然,直到数据发生变化)。sql将类似于:但是您可以通过检查sql跟踪来找出实际的sql。
如果你没有
OrderByDescending
:没有任何保证。