LINQ クエリは正しく機能しますが、生成される SQL は複雑で非効率的であるため、LINQ クエリを最適化しようとしています...
基本的に、必要な製品 (reqdProdId) を注文し、クレジット カード番号に登録されている (CustomerDisplay オブジェクトとして) 顧客を選択しようとしています (外部キー CustId を持つ RegisteredCustomer テーブルの行として保存されます)。
var q = from cust in db.Customers
join regCust in db.RegisteredCustomers on cust.ID equals regCust.CustId
where cust.CustomerProducts.Any(co => co.ProductID == reqdProdId)
where regCust.CreditCardNumber != null && regCust.Authorized == true
select new CustomerDisplay
{
Id = cust.Id,
Name = cust.Person.DisplayName,
RegNumber = cust.RegNumber
};
概要として、Customer には Name を持つ対応する Person があります。PersonID は Customer テーブルの外部キーです。生成された SQL を見ると、Person テーブルからすべての列が選択されていることがわかります。参考までに、DisplayName は Customer.FirstName と LastName を使用する拡張メソッドです。Person の列を制限する方法はありますか?
2 番目に、必要な ProductID を持つ他のすべての CustomerIds を選択するために、Any 句を削除 (およびサブクエリを使用) したいと考えています。これは、(当然ながら) Exists 句を生成するためです。ご存じかもしれませんが、LINQ にはジャンクション テーブルに関する既知の問題があるため、cust.CustomerProducts.Products だけを実行することはできません。必要な ProductID を持つジャンクション テーブル内のすべての顧客を選択するにはどうすればよいですか?
ヘルプ/アドバイスをいただければ幸いです。