【问题标题】:Expression method, default value for the body表达式方法,body的默认值
【发布时间】:2012-09-04 18:26:05
【问题描述】:

我有这个代码:

var listExpression = new List<Expression>();
var parameter = Expression.Parameter(typeof(T));

var memberExpression = Expression.PropertyOrField(parameter, MyProperty);
    listExpression.Add(
    Expression.Call(
        ((MemberExpression)memberExpression), "Contains", null,
        Expression.Constant((string)MyValue))
    );

Expression body = Expression.Constant(true);
foreach (var expression in listExpression)
    body = Expression.And(body, expression);

return Expression.Lambda<Func<T, bool>>(body, parameter);

这样的结果是:

"True & $var1.AGE >= 5"

当我将此谓词与实体框架一起使用但不适用于 NHiernate 时,我没有任何问题。我认为问题是“真”。没有这个“真”是否可以创建这个谓词?

【问题讨论】:

  • 不完全是一个直接的答案,但是:您可以尝试用基于LINQKit 的等效代码替换此代码,看看是否可以解决问题? (作为奖励,您将获得大量的可读性。)
  • 更新了代码,忘了一行。
  • @Kris-I: 你把True 放在表达式中是为了什么?
  • @Dennis 为什么你的意思是?我不想有这个真实的
  • @Kris-I:请发布您想用表达式构建的 LINQ 示例。

标签: c# .net entity-framework nhibernate predicate


【解决方案1】:

替换

Expression body = Expression.Constant(true);
foreach (var expression in listExpression)
    body = Expression.And(body, expression);

通过

var body = listExpression.First();//check first if listExpression.Any() would be better
listExpression.Skip(1).Aggregate(body, Expression.And);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 2013-10-16
    • 2015-02-18
    相关资源
    最近更新 更多