Where的布尔表达式

时间:2011-04-25 22:49:22

标签: c# .net entity-framework

我正在使用可空变量过滤数据 如果变量为null,则过滤器关闭 有没有更好的写作方式:

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

(我有4个以上的过滤器,看起来像是一大堆乱七八糟的东西)

3 个答案:

答案 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)