好吧,我有两个表达式X , Y
如果flag为true则y具有表达式
我需要List<mylist> v = list.where(x).where(y).ToList();
在这种情况下,如果y表达式为null,则会抛出异常,
我知道在构建查询之前我可以检查null,但是在一个巨大的查询中,这可能是一场噩梦。
那么在执行表达式时是否有任何方法或值来告诉表达式被忽略?
答案 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
;这将允许您同时返回LambdaExpression
和DefaultExpression
。