これをコードの他の場所で使用できる再利用可能な式にラップするにはどうすればよいですか?
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
ただし、式を返す関数からラムダを使用すると;
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 に評価される理由がまったくわからないことです。