InvalidCastException:MongoDB驱动程序中的LambdaExpression的ConstantExpression

时间:2012-10-25 23:26:18

标签: c# linq mongodb lambda mongodb-.net-driver

如何将其包装成可重复使用的表达式,我可以在代码中的其他地方使用?

nv => nv.a == nv2.a

我尝试过这样做,但似乎返回ConstantExpression而不是LambdaExpression

public Func<EntityName, bool> compareExpression()
{
    return nv => nv.a == this.a;
}

我不介意我是如何做到这一点的,只要我有一个可以在代码中的多个位置使用的LambdaExpression。 DB驱动程序将读取表达式并进行转换。

更多详情

鉴于此;

db.p.insert(
  {
    arrayNest: [
      { a:1, b:10 },
      { a:2, b:20 },
      { a:3, b:30 },
      { a:4, b:40 },
]
  }
);

class NV {
    int a;
    int b;
    public Func<EntityName, bool> compareExpression()
    {
        return nv => nv.a == this.a;
    }
}
class P {
     NV[] arrayNest;
}

一种方法;

    public virtual void Delete(Expression<Func<T, bool>> criteria)
    {
        this.Collection.Remove(Query<T>.Where(criteria));
    }

    var nv2 = new NV();
    Delete(p => p.arrayNest.Any(nv => nv.a == nv2.a)); // Works fine

但是,当我使用函数中的lambda返回表达式时;

    Delete(p => p.arrayNest.Any(nv => nv2.compareExpression())); // FAILS

我得到了

 System.InvalidCastException: Unable to cast object of type 'System.Linq.Expressions.ConstantExpression' to type 'System.Linq.Expressions.LambdaExpression'.

 Result StackTrace: 
  at MongoDB.Driver.Linq.PredicateTranslator.BuildAnyQuery(MethodCallExpression methodCallExpression)  

我看到MongoDB.Driver.Linq.PredicateTranslator假设每个表达式都是(LambdaExpression)

这是驱动程序问题,还是我做错了什么? 什么是奇怪的是我不明白它为什么要评估ConstantExpression。

1 个答案:

答案 0 :(得分:0)

问题是你的compareExpression方法返回一个表达式而不是Any方法正在寻找的布尔值。您可以像这样调用compareExpression返回的表达式:

Delete(p => p.arrayNest.Any(nv => nv.compareExpression().Invoke(nv)));

但是compareExpression编写传递给compareExpression的对象的方式与this对象相同,因此它将始终返回true。