2012-04-11 42 views
4

我有事務對象列表,並希望根據用戶當前所處的視圖以特定條件對其進行排序。如何在LINQ中忽略'where'和'order by'條件

我遇到的問題是,爲了在where子句中添加一個條件,首先我需要檢查它是否爲null,以防止出現空指針異常。這會導致列空值被過濾出來的記錄(並且我想將它們包含在列表的底部)。

如何修改查詢以便它忽略條件(where和order by)如果該列爲null並仍將它們追加到結果集?

這是一個例子查詢:

transactions = transactions 
        .Where(t => t.PurchaseRequisition != null && 
        t.Award != null && t.PurchaseRequisition.RequisitionedBy != null) 
        .OrderBy(t => t.Award.ContractNumber). 
        ThenBy(t => ToSafeString(t.Award.ContractNumber)). 
        ThenBy(t => ToSafeString(t.PurchaseRequisition.RequisitionedBy.FullName)); 


public string ToSafeString(string s) 
{ 
    return s ?? String.Empty; 
} 

//我想記錄,其中PurchaseRequisition或獎爲null附加到結果集。

+1

如何訂購結果集的一部分?我想你會需要兩個查詢。 – 2012-04-11 15:36:18

回答

5

您只需修改OrderByThenBy條款:

.OrderBy(t => t.Award == null || t.Award.ContractNumber == null) 
.ThenBy(t => t.Award == null ? "" : ToSafeString(t.Award.ContractNumber)) 
.ThenBy(t => t.PurchaseRequisition == null ? "" 
      : ToSafeString(t.PurchaseRequisition.RequisitionedBy.FullName)); 

現在,您可以完全刪除Where條款。

+0

你能解釋一下OrderBy參數是如何工作的嗎?生成的SQL可能看起來像什麼?我從來沒有見過這種方式。 – 2012-04-11 15:49:57

+0

它似乎在工作,你能解釋一下條件的第一條命令嗎?順便說一句,它看起來會將頂部的空列放置在記錄中。 – ljustin 2012-04-11 15:50:31

+0

@SteveMallory:我不確定SQL如何看起來像,你只需要檢查它。 – 2012-04-12 08:40:07