我使用可空變量來過濾數據。
如果變量爲空,則過濾器關閉。
有沒有寫任何更好的方式:布爾表達式Where Where
GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))
(我有更多然後4個過濾器,它看起來像亂一塊巨大的)
我使用可空變量來過濾數據。
如果變量爲空,則過濾器關閉。
有沒有寫任何更好的方式:布爾表達式Where Where
GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))
(我有更多然後4個過濾器,它看起來像亂一塊巨大的)
沒有,沒有寫一個更好的方式相同。然而,我不得不說,對於你想要的邏輯(這不是的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)
也許你可以使用擴展方法來構建它。
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);
有沒有辦法爲每個可空類型(long ?, int?,string等)寫這個方法? – Naor 2011-04-25 23:14:38
@Naor可空類型(不包括'string')是['Nullable
你不能神奇地調用這樣的表達式......你不得不重建它。 – 2011-04-25 23:24:33
你舉的例子:
GetQuery().Where(pd => pd.CustomerID == (customerId ?? pd.CustomerID))
如果沒有把握:
GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))
可以使用空合併運算符??
寫它即時證明了一些事情,但這是一個選擇。
這很有趣,雖然你我相信你的意思是有'customerId ?? pd.CustomerID'包裹在parens中,否則它將是一個無效的表達式(一般來說)。 – 2011-04-25 23:17:41
有趣。我會認爲'''會比'=='綁定更緊密 – 2011-04-25 23:47:09
我實際上使用.Where(pd => ... && ... && ...)而不是每個條件的地方。它會傷害效率嗎? – Naor 2011-04-25 22:59:56
@Naor:它沒有任何意義上的區別。如果這是LINQ到SQL,那麼它甚至沒有區別*。 – Timwi 2011-04-25 23:00:52
我不能說效率,但我肯定會鏈接LINQ擴展方法,然後將大量條件合併成一個匿名謂詞... – 2011-04-25 23:01:17