我正在使用可空变量过滤数据 如果变量为null,则过滤器关闭 有没有更好的写作方式:
GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))
(我有4个以上的过滤器,看起来像是一大堆乱七八糟的东西)
答案 0 :(得分:3)
你的例子:
GetQuery().Where(pd=> (!customerId.HasValue || pd.CustomerId==customerId.Value))
可以使用空合并运算符??
编写:
GetQuery().Where( pd => pd.CustomerID == ( customerId ?? pd.CustomerID ) )
不确定它是否会改善,但它是一种选择。
答案 1 :(得分: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);
答案 2 :(得分:1)
不,没有更好的方法来写同样的东西。但是,我必须说,对于你想要的逻辑(这不是Nullable类型中null
的标准含义),它很短。我认为你不能期望更短。
我发现它并不特别难以辨认或凌乱,即使你有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)