私はこの式を持っています:
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
あなたはほとんどそれを正しく持っていました:
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
。
一般的なケースでそれを処理するためにできることは、値がnullであるかどうかによって最初に順序を付け、タイブレーカーとしての値自体に基づいてthen順序にすることです。
troubletickets = troubletickets.OrderBy(t => t.UserProfile != null)
.ThenByDescending(t => t.UserProfile);
あなたはそれに近い
OrderByDescending(t => t.UserProfile != null ? t.UserProfile.FirstName : "ZZZ")
ここでは、t.userProfile
がnull
である場合、その値はZZZ
であると見なされるべきであると述べています。 t.userProfile.FirstName
についても同じようにします。
OrderByDescending(t => t.UserProfile != null ?
t.UserProfile.FirstName ?? "ZZZ" :
"ZZZ")
「??」合体演算子です(左のステートメントがNULLでない場合は、左のステートメントを使用し、そうでない場合は右のステートメントを使用します)