web-dev-qa-db-ja.com

LINQ Order by Descending by Null Values with Bottom

私はこの式を持っています:

troubletickets = db.ServiceTickets.Include(t => t.Company).Include(t => t.UserProfile);
troubletickets.OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ");

UserProfileがnullかどうかを確認する必要があります。そうしないと、エラーが発生します。問題は、UserProfiles.FirstNameがnullになる場合があることです。 nullの場合、昇順と降順の両方で並べ替えると、これらの値がリストの先頭に配置されます。例えば。

// Null, Null, Andy, Bill, Chris
// Null, Null, Chris, Bill, Andy

降順で注文すると、代わりに次のようなものが返されるように、この式を変更するにはどうすればよいですか?

// Chris, Bill, Andy, Null, Null
15
mdk09

あなたはほとんどそれを正しく持っていました:

troubletickets.OrderByDescending(t => t.UserProfile != null
                                      && t.UserProfile.FirstName != null
                                         ? t.UserProfile.FirstName
                                         : string.Empty);

string.Emptyは常に最低文字列であるため、最後にOrderByDescendingになります。

昇順と降順の両方で機能するものが必要な場合は、2つの手順で並べ替える必要があります。

troubletickets.OrderByDescending(t => t.UserProfile != null
                                      && t.UserProfile.FirstName != null)
              .ThenByDescending(t => t.UserProfile != null                // Or ThenBy
                                         ? t.UserProfile.FirstName
                                         : null);

これは、true > false

24

一般的なケースでそれを処理するためにできることは、値がnullであるかどうかによって最初に順序を付け、タイブレーカーとしての値自体に基づいてthen順序にすることです。

troubletickets = troubletickets.OrderBy(t => t.UserProfile != null)
   .ThenByDescending(t => t.UserProfile);
4
Servy

あなたはそれに近い

 OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ")

ここでは、t.userProfilenullである場合、その値はZZZであると見なされるべきであると述べています。 t.userProfile.FirstNameについても同じようにします。

 OrderByDescending(t => t.UserProfile != null ?
   t.UserProfile.FirstName ?? "ZZZ" :
   "ZZZ")

「??」合体演算子です(左のステートメントがNULLでない場合は、左のステートメントを使用し、そうでない場合は右のステートメントを使用します)

2
SJuan76