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

C# LINQ-FirstOrDefault()是否总是返回相同的记录?,c#,sql,entity-framework,linq,linq-to-entities,C#,Sql,Entity Framework,Linq,Linq To Entities,如果我有以下“用户”表 UserName UserID -------- ------ abc 1 xyz 2 pqr 2 以及以下linq查询: _context.User.OrderByDescending(x => x.UserID).FirstOrDefault(); _context.User.OrderByDescending(x => x.UserID).FirstOrDefault(); 结果是否总是一致的 就像在中一样,我总是会

如果我有以下“用户”表

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

以及以下linq查询:

_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
结果是否总是一致的


就像在中一样,我总是会得到用户名为“xyz”的用户或用户名为“pqr”的用户,还是随机的?

警告:我在这里假设
用户
表上的
用户ID
列是一个PKID,并且是唯一的

您发出的是有序查询,因此是:它将始终返回
pqr
记录(显然,直到数据发生更改)。SQL将类似于:

选择前1名*
来自用户
按用户标识描述订购
但是,您可以通过使用SQL跟踪进行检查来找出实际的SQL


如果您没有按降序排列的
OrderByDescending
:将无法保证。

警告:我在这里假设
User
表上的
UserId
列是一个PKID,并且是唯一的

您发出的是有序查询,因此是:它将始终返回
pqr
记录(显然,直到数据发生更改)。SQL将类似于:

选择前1名*
来自用户
按用户标识描述订购
但是,您可以通过使用SQL跟踪进行检查来找出实际的SQL


如果您没有降序排序:就没有任何保证。

是的,有点小题大做,
FirstOrDefault
将始终返回序列中的“第一个”项(如果没有项,则返回默认值)。可以改变的是降序排序所呈现的内容。您有两个具有相同用户ID值的项,因此当您请求按该值排序的项时,SQL不能保证每次具有相同ID的项的顺序都是相同的。

有点刺耳,是的,
FirstOrDefault
将始终返回序列中的“first”项(如果没有项目,则为默认值)。可以更改的是由降序显示的内容。您有两个具有相同用户ID值的项目,因此当您请求按该值排序的项目时,SQL不能保证具有相同ID的项目的顺序每次都相同。

在这种情况下,使用OrderByDesce后,它不会是随机的如果从具有重复UserID的表用户中删除UserID,则另一个依赖列将以与用户表中相同的顺序出现在最终列表中

如果这是桌子上的顺序

UserName UserID
-------- ------
abc      1
pqr      2
xyz      2
以及以下linq查询:

_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
将给出输出:具有pqr的用户


希望这会有所帮助。

在这种情况下,它不会是随机的,在使用OrderByDescending on UserID之后,从具有重复UserID的表用户开始,另一个依赖列将以与在用户表中相同的顺序出现在最终列表中

如果这是桌子上的顺序

UserName UserID
-------- ------
abc      1
pqr      2
xyz      2
以及以下linq查询:

_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
_context.User.OrderByDescending(x => x.UserID).FirstOrDefault();
将给出输出:具有pqr的用户

希望这能有所帮助。

我在

此方法执行稳定排序;即,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序

因此,由于这是一个稳定排序,IEnumerable OrderBy的结果将始终相同

但是,尽管您没有告诉我,因为您使用的是
\u context.User
,我假设该表位于数据库管理系统中。结果取决于您的DBMS

说:

执行表示调用OrderBy(IQueryable,expression>)的表达式树时发生的查询行为取决于源参数类型的实现。预期的行为是,它根据通过调用源元素的每个元素上的KeySelect获得的键对源元素进行排序

要说两个元素的排序结果取决于您使用的DBMS,这是一种很困难的方法。如果您想确定排序结果始终相同,则必须按第二个元素进行排序,如果需要,则按第三个元素进行排序,直到您确定按唯一值进行排序。

我在中阅读了以下内容

此方法执行稳定排序;即,如果两个元素的键相等,则保留元素的顺序。相反,不稳定排序不会保留具有相同键的元素的顺序

因此,由于这是一个稳定排序,IEnumerable OrderBy的结果将始终相同

但是,尽管您没有告诉我,因为您使用的是
\u context.User
,我假设该表位于数据库管理系统中。结果取决于您的DBMS

说:

执行表示调用OrderBy(IQueryable,expression>)的表达式树时发生的查询行为取决于源参数类型的实现。预期的行为是,它根据通过调用源元素的每个元素上的KeySelect获得的键对源元素进行排序


这是一种很难确定排序两个元素的结果取决于所使用的DBMS的方法。如果要确定排序结果始终相同,则必须按第二个元素排序,如果需要,则按第三个元素排序,直到确定按唯一值排序为止。

这是否回答了您的问题?仅添加一项“通常”唯一记录id(UserID)具有重复项是非常糟糕的形式。这确实应该由您的数据库强制执行(在大多数数据库中,将其作为主键).澄清:在
User
表中,你真的有两个用户具有相同的
UserIdD
值吗?这听起来像是缺少关键约束,坦率地说,你想要一个或答案吗?@sayahimad肯定会在我可以的时候检查该线程……不幸的是,在我进行研究时,它没有出现,因此,我创建了一个新帖子。。Tha