0

私の MVC プロジェクトでは、Rocket U2 を使用してユニバース DB からエンティティ (edmx) が生成される EF を使用しています。edmx 世代の後、LINQ を使用したデータ検索の単純なビジネスになると感じましたが、次のような非常に単純で最初の LINQ ステートメントですぐに問題に遭遇したため、そうではありません。

1. var test1 = userRepo.QueryAll().Where(x => x.Code == model.UserName);
// generated SQL
FROM User AS Extent1
WHERE (Extent1.Code = ?) OR ((Extent1.Code IS NULL) AND (? IS NULL))}

シンプルですね。実際には、これまでに経験したこととは異なり、プロパティ値を where 句に渡すと、LINQ によって生成された SQL ステートメントが非常に奇妙になり、ハードコードされた値がある場合、次のステートメントは完全に正常に実行されます。

2. var test1 = userRepo.QueryAll().Where(x => x.Code == "JK");
// generated SQL
FROM User AS Extent1
WHERE 'JK' = Extent1.Code}

ここで、最初の LINQ クエリに戻ると、where 句の前に結果を列挙すると機能することに気付きました。以下のように

3. var test = userRepo.QueryAll().ToList().Where(x => x.Code == model.UserName);

ここで私が間違っていることを誰か説明してください。ただし、フィルターを適用する前に結果を列挙することはできますが、これは結合などを操作する必要がある後の開発には適していません。

個々のリポジトリではなく DbContext を直接操作しても、上記の動作は同じです。

4

0 に答える 0