【问题标题】:How to detect IsNull / NotNull when building dynamic LINQ expressions?构建动态 LINQ 表达式时如何检测 IsNull / NotNull?
【发布时间】:2013-09-14 05:40:01
【问题描述】:

我正在构建稍后评估的动态 LINQ 表达式。因此,例如,如果我想知道某个属性是否等于某个值,我会这样做:

// MemberExpression property;
// int? val;
Expression.Equal(property, Expression.Constant(val))

但是,我似乎找不到检测 val 是 Null 还是 NOT Null 的方法。有人可以向我推荐如何做到这一点吗?我试过这个:

Expression.Equal(property, Expression.Constant(null, property.Type));

但显然,这行不通。

【问题讨论】:

  • Once 选项是传入一个类似Property != null 的字符串并动态编译/调用它。我假设这是更大的表达式树的一部分?如果有,它是如何产生的?
  • 您能提供更多背景信息吗?很难理解你真正的问题在哪里......认为你应该做类似Expression.Constant(val, <theTypeofVal>) 的事情,其中​​ theTypeofVal 可能是一个可为空的类型,但我们不知道 val 来自哪里......
  • !val.HasValue 如果它是一个可为空的值类型?

标签: c# asp.net-mvc linq entity-framework


【解决方案1】:

好的,事实证明@Raphaël Althaus 是对的——问题部分出在我构建谓词的地方。所以看起来这实际上确实给了你空检查:

Expression.Equal(property, Expression.Constant(null, property.Type));

意味着您可以在查询中动态应用 Where 条件,例如:

// IQueryable<T> query;
// var arg = Expression.Parameter(typeof(T), "p");

var exp = Expression.Equal(property, Expression.Constant(null, property.Type));
          // for NOT NULL use Expression.NotEqual
var predicate = Expression.Lambda<Func<T, bool>>(exp, arg);
return query.Where(predicate);

感谢您的帮助!

【讨论】:

  • 此解决方案不检查它调用operator ==!的空值! 这可能相同,也可能不同。如果你真的想检查 null 你必须使用 Expression.ReferenceEqual 而不是 'Expression.Equal`。
猜你喜欢
  • 2014-07-06
  • 1970-01-01
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
相关资源
最近更新 更多