Я хочу оптимизировать свой запрос LINQ, потому что, хотя он работает правильно, генерируемый им SQL запутан и неэффективен ...
По сути, я хочу выбрать клиентов (как объекты CustomerDisplay), которые заказали требуемый продукт (reqdProdId) и зарегистрированы с помощью номера кредитной карты (хранящегося в виде строки в таблице RegisteredCustomer с внешним ключом CustId).
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
};
Для обзора: у Клиента есть соответствующее Лицо, у которого есть Имя; PersonID - это внешний ключ в таблице клиентов. Если я смотрю на сгенерированный SQL, я вижу, что все столбцы выбираются из таблицы Person. К сведению, DisplayName - это метод расширения, который использует Customer.FirstName и LastName. Любые идеи, как я могу ограничить столбцы от человека?
Во-вторых, я хочу избавиться от предложения Any (и использовать подзапрос) для выбора всех других идентификаторов клиентов, у которых есть требуемый ProductID, потому что он (по понятным причинам) генерирует предложение Exists. Как вы, возможно, знаете, у LINQ есть известная проблема с таблицами соединений, поэтому я не могу просто выполнить cust.CustomerProducts.Products. Как я могу выбрать всех клиентов в соединительной таблице с нужным ProductID?
Любая помощь / совет приветствуются.