2

次のような for ループ内に多数の LINQ クエリがあります。

Department department = db.Departments.Single(d => d.DepartmentID == teams[i].DepartmentID);

問題は、LINQ が配列要素との比較を好まず、LINQ to Entities がメソッド 'get_Item(Int32)' を認識しないという例外をスローすることです。選択したいチームリストの各プロパティに対してローカル変数を宣言する以外に、これを回避するより良い方法はありますか? forループが次のようなものでいっぱいになるのを避けたい

int departmentID = teams[i].DepartmentID;
string teamName = teams[i].TeamName;

4

3 に答える 3

8

forループが次のようなものでいっぱいになるのを避けたい...

残念ながら、通常はこれが最適なオプションです。式の評価では、式ツリーを SQL に変換できる必要がありますが、配列要素の処理方法がわかりません。一時変数を作成することは、このシナリオを処理する最も簡単で保守しやすい方法です。

于 2013-07-15T17:34:09.027 に答える
5

これで問題が解決するかどうかはわかりませんが、for ループを for each ループに変更して、インデックスでアクセスするのではなく、現在のオブジェクトを参照できるようにすることができます。問題は、SQL Server には配列が何であるかという概念がないため、その有効な C# 構文を使用しようとすると、それを式ツリーに変換して必要な SQL を生成する方法がわからないことです。for each の提案が機能しない場合は、現在の方法で行き詰まっていると思います。

于 2013-07-15T17:35:58.440 に答える
0

なぜあなたはそのようなことを書かないのですか:

var query = from d in db.Departments
                from t in teams
                where d.DepartmentID == t.DepartmentID && d.Team == t.TeamName
                select d;

これは簡単に式ツリーに変換でき、最終的に SQL に変換できます。

于 2013-07-15T18:17:09.047 に答える