布尔表达式Where Where

问题描述:

我使用可空变量来过滤数据。
如果变量为空,则过滤器关闭。
有没有写任何更好的方式:布尔表达式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) 
+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

也许你可以使用扩展方法来构建它。

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

你举的例子:

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