簡體   English   中英

LINQ Group然后是OrderBy Behavior

[英]LINQ GroupBy then OrderBy Behaviour

我有一個場景,我必須首先分組,然后對每個組進行排序。 我提出了以下工作查詢:

applicants = context.Applicants
                    .OrderBy(app => app.Id).Skip((pageNumber - 1)*defaultPageSize)
                    .Take(defaultPageSize)
                    .GroupBy(app => app.PassportNumber)
                    .Select(g => g.OrderBy(d => d.IsEndorseChild)).ToList()
                    .SelectMany(grouping => grouping)
                    .ToList();

但這不起作用:

applicants = context.Applicants
                    .OrderBy(app => app.Id).Skip((pageNumber - 1)*defaultPageSize)
                    .Take(defaultPageSize)
                    .GroupBy(app => app.PassportNumber)
                    .Select(g => g.OrderBy(d => d.IsEndorseChild))
                    .SelectMany(grouping => grouping)
                    .ToList();

第一個查詢生成結果(這些是返回的申請人的ID),如:
7, 10, 8, 2, 9, 6, 5, 3, 4, 1
但第二個查詢產生:
7, 10, 8, 2, 9, 6, 3, 4, 5, 1

我不確定為什么會發生這種情況以及查詢之間有什么區別。
我到底錯過了什么?

編輯:示例輸入和預期輸出:

Applicant 1 => ID : 1
               IsEndorsed : 0
               Passport : ABC123

Applicant 2 => ID : 2
               IsEndorsed : 1
               Passport : ABC123


Applicant 3 => ID : 3
               IsEndorsed : 0
               Passport : ABC1234

Applicant 4 => ID : 4
               IsEndorsed : 0
               Passport : A1234

Applicant 5 => ID : 5
               IsEndorsed : 1
               Passport : PQR123
Applicant 6 => ID : 6
               IsEndorsed : 1
               Passport : PQR123
Applicant 7 => ID : 7
               IsEndorsed : 0
               Passport : PQR123


Expected output  : (Grp by Passport Number and in each group IsEndorsed = 0 is at top)
----------------------------------------------

Applicant 1 => ID : 1
               IsEndorsed : 0
               Passport : ABC123

Applicant 2 => ID : 2
               IsEndorsed : 1
               Passport : ABC123

Applicant 3 => ID : 3
               IsEndorsed : 0
               Passport : ABC1234

Applicant 4 => ID : 4
               IsEndorsed : 0
               Passport : AX1234

Applicant 7 => ID : 7
               IsEndorsed : 0
               Passport : PQR123

Applicant 5 => ID : 5
               IsEndorsed : 1
               Passport : PQR123
Applicant 6 => ID : 6
               IsEndorsed : 1
               Passport : PQR123

您按布爾值排序。 只要一個組中的兩個值具有相同的IsEndorseChild值,它們相對於彼此的順序通常是未定義的。

這個OrderBy實際上被轉換為SQL ORDER BY ,因此結果還取決於您正在使用的數據庫的ORDER BY實現。 它可能是穩定的或不穩定的。
不穩定意味着它可以按任何順序返回具有相同有序值的行。
穩定意味着它將以與輸入相同的順序返回它們。

例如,SQL Server具有不穩定的排序: SQL order by子句是否保證穩定(按標准)

所以,我的結論是, ToList調用 - 兩個查詢中的唯一區別 - 對結果沒有影響。 差異僅僅是由於不穩定的排序造成的。

暫無
暫無

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

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