簡體   English   中英

跳過然后在可空的對象上

[英]Skip ThenBy on nullable objects

我有一個查詢,應該這樣訂購:

var list = new List<MonthClosureViewModel>();
var orderedList = list
    .OrderByDescending(x => x.Project)
    .ThenByDescending(x => x.ChargeLine)
    .ThenByDescending(x => x.DomesticSite) //<- x.DomesticSite might be null sometimes
    .ThenByDescending(x => x.ChargeSite)   //<- x.ChargeSite   might be null sometimes
    .ThenByDescending(x => x.RateGroup)
    .ThenByDescending(x => x.ApprovedHrs)
    .ThenByDescending(x => x.NotApprovedHrs);

public class MonthClosureViewModel
{
    public Project Project { get; set; }
    public ChargeLine ChargeLine { get; set; }
    public Site DomesticSite { get; set; }
    public Site ChargeSite { get; set; }
    public RateGroup RateGroup { get; set; }
    public decimal Rate { get; set; }
    public decimal ApprovedHrs { get; set; }
    public decimal NotApprovedHrs { get; set; }
}

但是如果任何對象為null(完全按設計),則此查詢失敗。 如果object為null,我如何在結尾處放置空值或跳過排序?

添加: @ LasseV.Karlsen提到我可能有另一個問題。 我真的得到了ArgumentNullException ,但原因並不是后面的某個對象是null (我在調試器中看到它並錯誤地認為這是我的問題)。 真正的原因是@RaphaëlAlthaus提到我沒有在MonthClosureViewModel任何類中實現IComparable<> ...

完成后,即使object為null ,一切都按預期開始工作

您需要將defaultSitedefaultChargeSite定義為比其他類中的所有其他對象更小或更大

var list = new List<MonthClosureViewModel>();
var orderedList = list
     .Where(x => x != null);
    .OrderByDescending(x => x.Project)
    .ThenByDescending(x => x.ChargeLine)
    .ThenByDescending(x => x.DomesticSite==null?defaultSite:x.DomesticSite) //<- x.DomesticSite might be null sometimes
    .ThenByDescending(x => x.ChargeSite==null?defaultChargeSite:x.ChargeSite)   //<- x.ChargeSite   might be null sometimes
    .ThenByDescending(x => x.RateGroup)
    .ThenByDescending(x => x.ApprovedHrs)
    .ThenByDescending(x => x.NotApprovedHrs);

您嘗試按復雜屬性排序,這是(如您所提到的)真正的問題。

為了使你成為可能,你也必須這樣做

  1. 在你的類上實現IComparable<T>

  2. 使用OrderBy / OrderByDescending的其他重載,它還將IComparer<TKey>作為參數(OrderBy重載的msdn

  3. 在order by子句中使用complex屬性的簡單屬性(使用null檢查。在這種情況下,必須進行null檢查以避免Null引用異常):

例如 :

.OrderByDescending(x => x.Project == null ? string.Empty : x.Project.Name)

暫無
暫無

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

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