3

私は動的クエリを作成する方法を探していましたが、見つかったものはすべて「メソッド構文」を使用していました。

「クエリ構文」の動的述語を作成することは可能ですか?

私は次のようなものを使用しようとしました

Expression<Func<TEntity, bool>>

述語内ですが、コンパイラは次のメッセージを返します

"Cannot convert Expression<Func<TEntity, bool>> to bool"

メソッド構文」では機能しますが、「クエリ構文」では機能しません

できます:

Expression<Func<Localization, bool>> locClause = (l => l.id == locId);

var results = UnitOfWork.Localization.AsQueryable().Where(locClause).ToList();

それは動作しません:

Expression<Func<Localization, bool>> locClause = (l => l.id == locId);

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause 
                          select l;

これを行う方法はありますか?

4

2 に答える 2

1

あなたが何を必要Expressionとしているのかわからないので、これがあなたが必要とするすべてを行うかどうかはわかりません. を使用すると、そうでAsQueryableはないと思われます (プロバイダーに直接クエリを実行している場合は、既に になっているはずですIQueryable<Localization>)。ただし、確認する必要があります。ただし、を使用する必要がない場合はExpression、次のようにすることができます。

Func<Localization, bool> locClause = (l => l.id == locId);

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause(l)
                          select l;

またはPredicate<T>:

Predicate<Localization> locClause = l => l.id == locId;

var result = from l in UnitOfWork.Localization.AsQueryable()
                          where locClause(l)
                          select l;

もちろん、これはデリゲートがクライアント上で実行され、サーバー上で実行されるものに変換されないことを意味します (つまり、プロバイダーによって生成された T-SQL の一部、それが現在実際に行われている場合)。それが必要な場合はExpression、引き続きメソッド チェーン構文を使用する必要があります。

var result = UnitOfWork.Localization.AsQueryable().Where(locClause);

意図に対してより明示的であること以外に、を選択Predicate<T>する理由はないと思います。Func<T,bool>Predicate<T>

また、メソッド チェーン構文よりもクエリ構文を使用しても、機能的な利点はありません。読みやすさと保守性だけです。プロバイダーで複雑な処理を行うと、通常はメソッド チェーンの構文に落とし込む結果になることがよくあります。私は通常、LINQ To Objects でクエリ構文を使用します。

于 2014-09-24T19:12:01.163 に答える
0

いいえ、メソッド構文を使用する必要があります。クエリ構文を使用して、変数にパラメータとして含まれる式をメソッドに提供する方法はありません。

于 2014-09-24T14:19:19.417 に答える