のインスタンスを返すリポジトリを持つプロジェクトをたくさん見てきましたIQueryable
。これにより、追加のフィルターとソートをIQueryable
他のコードで実行でき、異なるSQLが生成されます。私はこのパターンがどこから来たのか、それが良いアイデアであるかどうかに興味があります。
私の最大の懸念はIQueryable
、データベースが列挙されると、しばらくするとデータベースにヒットするという約束です。これは、エラーがリポジトリの外部にスローされることを意味します。これは、Entity Framework例外がアプリケーションの別のレイヤーでスローされることを意味する場合があります。
また、過去(特にトランザクションを使用する場合)に複数のアクティブな結果セット(MARS)の問題に遭遇しましたが、このアプローチはこれがより頻繁に発生するように聞こえます。
リポジトリコードを終了する前に、常にLINQ式を呼び出すAsEnumerable
かToArray
、各LINQ式の最後でデータベースがヒットすることを確認しました。
IQueryable
データレイヤーのビルディングブロックとして戻ることが役立つかどうか疑問に思っています。あるリポジトリが別のリポジトリを呼び出してさらに大きなIQueryable
。
where
deferred IQueryable
に句を追加する場合、結果セット全体ではなく、そのデータをネットワーク経由で送信するだけで済みます。