1

これをコードの他の場所で使用できる再利用可能な式にラップするにはどうすればよいですか?

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 に評価される理由がまったくわからないことです。

4

1 に答える 1

0

問題は、メソッドが探してcompareExpressionいるブール値ではなく、メソッドが式を返すことです。次のようAnyに返される式を呼び出すことができます。compareExpression

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

ただし、compareExpression渡されたオブジェクトを記述した方法はオブジェクトcompareExpressionと同じthisであるため、常に true を返します。

于 2012-10-26T07:15:32.200 に答える