1

これは私を夢中にさせています!簡単にするために、DDD に使用されるコード全体を掲載するつもりはありませんが、私が試したことを公開し、機能していないことを説明するだけです。

私は単純なデータベース構造を持っています:

Products (製品データを保持)
Orders (入力された注文を保持)
OrderProducts (注文と製品の間の参照テーブル)

Order 集計ルートがあり、1 つの単純な Order の製品数を取得したいと考えています。

Order by id をフェッチすると、EF ラムダになります。

var order = _orderRepository.Get(orderId);    

次に、次を使用して、その順序で製品の数を取得しようとします。

var count = order.OrderProducts.Count();

この行は、注文に大量のレコードがある場合に詰まります。これは、すべてのレコードを取得しているためです。罰金。そのため、注文内からカウントしたい製品にいくつかのフィルターを追加して、少し洗練しています。製品には、タイプを含むいくつかのプロパティがあります (つまり、タイプ ID があります)。だから、今私はこれを試しています:

//This is trimming down my results to about a dozen products)
var count = order.OrderProduct
                 .Where(op=>op.Product.TypeId == 2)
                 .Count();  

Linqpad を使用して、生成された SQL の種類を確認すると、驚いたことに、この注文からすべての OrderProducts をまだロードしています!

クエリでフィルターを直接適用するにはどうすればよいですか?

4

1 に答える 1

1

ナビゲーションプロパティに触れると(つまりorder.OrderProducts)熱心な読み込みが開始され、それらすべて(つまり、不要なものも)が読み込まれるため、それらすべてが読み込まれます。それを減らすための唯一のオプションは、orderID. たぶん次のようなもの:

_orderProductRepository.Where(p => p.OrderID == orderId && p.Product.TypeID == 2);
于 2013-03-01T16:01:12.207 に答える