如何将其包装成可重复使用的表达式,我可以在代码中的其他地方使用?
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。
答案 0 :(得分:0)
问题是你的compareExpression
方法返回一个表达式而不是Any
方法正在寻找的布尔值。您可以像这样调用compareExpression
返回的表达式:
Delete(p => p.arrayNest.Any(nv => nv.compareExpression().Invoke(nv)));
但是compareExpression
编写传递给compareExpression
的对象的方式与this
对象相同,因此它将始终返回true。