簡體   English   中英

LINQ - FirstOrDefault() 是否總是返回相同的記錄?

[英]LINQ - Will FirstOrDefault() always return the same record?

如果我有以下“用戶”表

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

以及以下 linq 查詢:

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

結果總是一致的嗎?

因為我總是會得到用戶名“xyz”的用戶或用戶名“pqr”的用戶,還是隨機的?

有點刻薄,是的, FirstOrDefault始終返回序列中的“第一個”項目(如果沒有項目,則返回默認值)。 可能會改變的是OrderByDescending呈現的內容。 您有兩個具有相同UserId值的項目,因此當您要求按該值排序的項目時,SQL 不保證具有相同 ID 的項目的順序每次都相同。

在這種情況下,它不會是隨機的,在對具有重復 UserID 的表用戶中的用戶 ID 使用 OrderByDescending 后,另一個依賴列將以與用戶表中相同的順序出現在最終列表中。

例如。 如果這是表中的順序

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

以及以下 linq 查詢:

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

會給 Output: user with pqr

希望這可以幫助。

我在Enumerable.OrderBy中閱讀了以下內容

該方法執行穩定排序; 也就是說,如果兩個元素的鍵相等,則保留元素的順序。 相反,不穩定的排序不會保留具有相同鍵的元素的順序。

因此,由於這是一個穩定的排序,IEnumerable OrderBy 的結果將始終相同。

但是,盡管您沒有這么說,因為您使用的是_context.User ,我假設該表位於數據庫管理系統中。 結果取決於您的 DBMS。

Queryable.OrderBy說:

由於執行表示調用 OrderBy(IQueryable, Expression>) 的表達式樹而發生的查詢行為取決於源參數類型的實現。 預期的行為是它根據對 source 的每個元素調用 keySelector 獲得的鍵對 source 的元素進行排序。

很難說對兩個元素進行排序的結果取決於您使用的 DBMS。 如果你想確定你總是有相同的排序結果,你必須訂購第二個元素,如果需要第三個,直到你確定你正在對唯一值進行排序。

警告:我在這里假設User表上的UserId列是 PKID 並且是唯一的。

您正在發出有序查詢,所以是的:它將始終返回pqr記錄(顯然,直到數據更改)。 SQL 將類似於:

select top 1 *
from User
order by UserId desc

但是您可以通過檢查 SQL 跟蹤來找出實際的 SQL。

如果您沒有OrderByDescending :將無法保證。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM