2011-04-25 156 views
0

我使用可空變量來過濾數據。
如果變量爲空,則過濾器關閉。
有沒有寫任何更好的方式:布爾表達式Where Where

GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value)) 

(我有更多然後4個過濾器,它看起來像亂一塊巨大的)

回答

1

沒有,沒有寫一個更好的方式相同。然而,我不得不說,對於你想要的邏輯(這不是的Nullable類型的標準含義),它非常短。我不認爲你會期望得到更短的。

即使您有4條甚至10條底線的底線,我也不會覺得它特別難以辨認或混亂。我能想到的最短的是:

GetQuery().Where(pd => customerId == null || pd.CustomerId == customerId) 
      .Where(pd => customerName == null || pd.CustomerName == customerName) 
      .Where(pd => customerAddress == null || pd.CustomerAddress == customerAddress) 
      .Where(pd => customerPostcode == null || pd.CustomerPostcode == customerPostcode) 
      .Where(pd => customerCountry == null || pd.CustomerCountry == customerCountry) 
      .Where(pd => customerPhoneNumber == null || pd.CustomerPhoneNumber == customerPhoneNumber) 
+0

我實際上使用.Where(pd => ... && ... && ...)而不是每個條件的地方。它會傷害效率嗎? – Naor 2011-04-25 22:59:56

+0

@Naor:它沒有任何意義上的區別。如果這是LINQ到SQL,那麼它甚至沒有區別*。 – Timwi 2011-04-25 23:00:52

+0

我不能說效率,但我肯定會鏈接LINQ擴展方法,然後將大量條件合併成一個匿名謂詞... – 2011-04-25 23:01:17

2

也許你可以使用擴展方法來構建它。

public static IQueryable<T> OptionalWhere<T>(this IQueryable<T> query, int? id, Expression<Func<T, int, bool>> filter) 
{ 
    if (id.HasValue) 
    { 
     var idValue = id.Value; 
     query = query.Where(e => filter(e, idValue)); 
    } 
    return query; 
} 

然後在查詢變爲:

var q = GetQuery().OptionalWhere(customerId, (pd, id) => pd.CustomerId == id); 
+0

有沒有辦法爲每個可空類型(long ?, int?,string等)寫這個方法? – Naor 2011-04-25 23:14:38

+0

@Naor可空類型(不包括'string')是['Nullable ''(http://msdn.microsoft.com/en-us/library/b3h38hb0.aspx)]的實例。你總是可以使'id'參數的類型爲'Nullable '(儘管如此,這並不能幫助你處理字符串)。 – 2011-04-25 23:17:53

+0

你不能神奇地調用這樣的表達式......你不得不重建它。 – 2011-04-25 23:24:33

3

你舉的例子:

GetQuery().Where(pd => pd.CustomerID == (customerId ?? pd.CustomerID)) 

如果沒有把握:

GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value)) 

可以使用空合併運算符??寫它即時證明了一些事情,但這是一個選擇。

+0

這很有趣,雖然你我相信你的意思是有'customerId ?? pd.CustomerID'包裹在parens中,否則它將是一個無效的表達式(一般來說)。 – 2011-04-25 23:17:41

+0

有趣。我會認爲'''會比'=='綁定更緊密 – 2011-04-25 23:47:09