如果它是null或空而不检查IF语句中的null,可以忽略它吗?

时间:2013-11-16 08:16:38

标签: c# linq linq-expressions

好吧,我有两个表达式X , Y

如果flag为true则y具有表达式

我需要List<mylist> v = list.where(x).where(y).ToList();

在这种情况下,如果y表达式为null,则会抛出异常,

我知道在构建查询之前我可以检查null,但是在一个巨大的查询中,这可能是一场噩梦。

那么在执行表达式时是否有任何方法或值来告诉表达式被忽略?

3 个答案:

答案 0 :(得分:6)

当y设置为null时,您可以使用coalesce运算符提供另一个Expression:

list.Where(y ?? (() => true))

答案 1 :(得分:6)

您可以轻松添加自己的扩展方法。目前还不清楚您是使用IQueryable<>还是IEnumerable<>(由于套管问题以及没有Where方法返回{{1}这一事实,您的代码无法以任何方式编译你正在声明它的同一个语句中使用List<T>这一事实,但你可以轻松处理这两个问题:

x

然后:

public static class NullSafeExtensions
{
    public static IEnumerable<T> NullSafeWhere<T>(this IEnumerable<T> source,
        Func<T, bool> predicate)
    {
        return predicate == null ? source : source.Where(predicate);
    }

    public static IQueryable<T> NullSafeWhere<T>(this IQueryable<T> source,
        Expression<Func<T, bool>> predicate)
    {
        return predicate == null ? source : source.Where(predicate);
    }
}

(当然,就谓词而言,它只是无效的,而不是来源......)

答案 2 :(得分:0)

在您的情况下,使用Expression<Func<BAL.vw_BudgetRecord, bool>>返回类型调用方法应始终返回该类型的表达式。

假设您的示例,您可能希望返回bool?(可以为空的bool)以防使用不是SuperAdmin角色。

如果我是对的,您应该将方法返回类型更改为Expression<Func<BAL.vw_BudgetRecord, bool?>>

如果没有,您只需将返回类型更改为Expression;这将允许您同时返回LambdaExpressionDefaultExpression