IQueryableで実行したい「SQLへの変換がない」メソッドがあります。中間クラスに格納せずにIQueryableを強制的に実行する方法はありますか?
3 に答える
メソッドをデータベースではなくローカルで実行することに問題がありますか? もしそうなら、AsEnumerable
あなたの友達です。それは非常に単純な方法で、次のようなものです。
public IEnumerable<T> AsEnumerable(IEnumerable<T> source)
{
return source;
}
重要なことは、結果の型がIEnumerable<T>
ではなくコンパイル時の型にIQueryable<T>
なることです。つまり、その後に呼び出す LINQ クエリ演算子は、LINQ to SQL ではなく LINQ to Objects になります。
例えば:
var query = context.Employees
// Filtering performed in SQL
.Where(emp => emp.IsFullTime)
.AsEnumerable()
// Projection performed locally; ComputeSalary has no
// SQL equivalent
.Select(emp => new { Employee = emp,
Salary = ComputeSalary(emp) });
他の場所で提案されているように呼び出すこともできますが、フィルタリングを行っていて、メモリ内の完全なToList
リストが本当に必要ない場合は、その結果を呼び出してフィルタリングする方が、最初にすべてをロードするよりも効率的です。AsEnumerable
List<Employees> myEmployees = myqueryable.ToList();
そして、そのリストでlinqを実行できます。
LinqToSql が SQL に変換する方法がわからないというクエリを記述したときに、そのメッセージが表示されます (これも同様です)。
あなたが求めていることを正確に理解できるかどうかはわかりませんが、私が見る限り、次のオプションがあります。
- LinqToSql が翻訳できるようにクエリを書き直します
- Sqlサーバーでできる限り多くのクエリを実行し、残りをメモリ内で実行します(オブジェクトへのlinqを使用)
- 座って泣いて
#3 を除外すると仮定して、他の 2 つの例を見てみましょう。
それを書き直す - それを助けるために、linq クエリが必要です。
ここでは、最初のクエリから変換できない部分を取り出し、次に Iqueryable 呼び出しで ToList を呼び出し、残りのクエリをそのリストに適用します。
また、クエリを保存せずに実行できますか? 実際にはそうではありませんが、常に結果をループして変数に格納しないこともできますが、クエリの結果はどこかに格納する必要があることは明らかです。