ご覧いただきありがとうございます。
バックグラウンド
C# で記述し、LINQ を使用してレポートのエンティティをクエリしています。このレポートには、基本的に次のような一連のエンティティがあります。
Customer{
Name: "Bob",
ProductsPurchased: ArrayOfChildEntities[{
ProductId: 1,
ProductTypeId: 5,
ProductName: "FooBuzz"
},
{...},
{...}]
}
ProductsPurchased
製品タイプ ID を含む子エンティティの配列です。ユーザーがビューのフィルター リストから選択したタイプ ID の配列を渡すとします。
var ProductTypesToShow = [1, 3, 5];
そのため、返品された顧客ごとに、購入した、、、またはのタイプ1
の製品のみを表示したいと思います。 顧客がタイプ、、またはの製品を 1 つも購入したことがない場合、その顧客オブジェクト全体を結果セットから削除する必要があります。3
5
1
3
5
私が試したこと
私はこのようなものを使ってみました:
var customers = db.Customers.Where(c => c.ProductsPurchased.Select(p => ProductTypesToShow.Contains(p.ProductTypeId));
しかし、これは失敗します。私もさまざまなバージョンのIntersect
and を試しましAny
たが、残念ながら、それらはすべて何らかの理由で失敗するか、必要なすべてのことを実行できません。
1
タイプ、3
、またはの製品を購入した顧客のみを選択します5
。1
それらの顧客のうち、タイプが 、3
、またはではない製品をすべて削除5
してから、データをビューに送り返します。
foreach
最後に、最初のクエリで見つかったすべての顧客を反復し、製品を反復して製品タイプでフィルター処理するという怪物を書きましたが、これは容認できないほど遅くなりました (クエリごとに約 3 分!!)。
ここで明らかな何かが欠けているに違いないと感じています。どんな提案でも大歓迎です!