如何将其包装成可重用的表达式,以便在代码的其他地方使用?
nv => nv.a == nv2.a
我试过这样做,但似乎返回 aConstantExpression
而不是 a 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。