我有这个表达:
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时,当我按升序和降序排序时,这些值将放在列表的顶部。 E.g。
// Null, Null, Andy, Bill, Chris
// Null, Null, Chris, Bill, Andy
如何更改此表达式,以便在我按降序排序时返回类似的内容:
// Chris, Bill, Andy, Null, Null
答案 0 :(得分:21)
你几乎没错:
troubletickets.OrderByDescending(t => t.UserProfile != null
&& t.UserProfile.FirstName != null
? t.UserProfile.FirstName
: string.Empty);
string.Empty
将始终是最低字符串,因此最终会以OrderByDescending
结尾。
如果你想要一些既有升序又有降序的东西,你必须分两步进行排序:
troubletickets.OrderByDescending(t => t.UserProfile != null
&& t.UserProfile.FirstName != null)
.ThenByDescending(t => t.UserProfile != null // Or ThenBy
? t.UserProfile.FirstName
: null);
这是因为true > false
。
答案 1 :(得分:4)
在一般情况下,您可以做的是首先根据值是否为空来排序,然后根据值本身作为决胜局的然后顺序。
troubletickets = troubletickets.OrderBy(t => t.UserProfile != null)
.ThenByDescending(t => t.UserProfile);
答案 2 :(得分:2)
你离它很近
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")
“??”是coalesce运算符(如果left语句不为null,则使用left语句,否则使用right语句)