布尔表达式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)
也许你可以使用扩展方法来构建它。
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