0

Subsonic 3.0.0.3 用の複合クエリを作成したいのですが、これにはどのような方法が最適ですか?

私は試した;

        Expression<Func<Person, bool>> exp = p => true;
        Expression<Func<Person, bool>> fContinent = p => p.ContinentID == 1;
        Expression<Func<Person, bool>> fType = p => p.TypeID == 1;
        exp = Expression.Lambda<Func<Person, bool>>(Expression.AndAlso(exp, fContinent), exp.Parameters);
        exp = Expression.Lambda<Func<Person, bool>>(Expression.AndAlso(exp, fType), exp.Parameters);
        var personList = Person.Find(exp);

ただし、「二項演算子 AndAlso が定義されていません ...」という例外が発生します。

述語も使用してみましたが、例外もスローされます (Expression.Invoke はサポートされていません)。

subsonic 2 では SqlQuery オブジェクトを使用していましたが、バージョン 3 で linq / 式を使用してこれを行う適切な方法を知りたいです。

4

2 に答える 2

0

私はこの質問をしましたが、あなたと同じようにサブソニックで結合クエリを使用しています。

つまり、PredicateBuilderを使用してクエリを作成します。サブソニック オブジェクト (ActiveRecord を想定) で実行する場合は、次のようなコードを使用します。

var predicate = /* Build up predicate with PredicateBuilder */;
var recs = SubsonicClass.All().Where(predicate.Compile()).ToList();
于 2010-10-14T14:57:17.110 に答える
0

And代わりに試しましたAndAlsoか?

これを行う正しい方法は、次のようにラムダ式の本体を結合することです。

exp = Expression.Lambda<Func<Person, bool>>(
    Expression.And(exp.Body, fContinent.Body), exp.Parameters);

Andがクエリ プロバイダでサポートされている場合でも、fContinentの Body 内のパラメータ参照を で定義されているパラメータへの参照に置き換える必要があります --expそのままで、2 つの式本体 ( と組み合わせてAnd) は、それぞれに名前が付けられた 2 つの異なるパラメータを参照します。 p.

式パラメーターを置き換える最もクリーンな方法については、この質問に対する私の回答を参照してください。

于 2009-09-14T15:23:06.157 に答える