Linq to Entities чрезмерные объединения в сгенерированном SQL - PullRequest
0 голосов
/ 20 апреля 2009

У меня установлена ​​модель данных сущности .NET с отношениями, поэтому мне не нужно вручную объединять сущности в моих запросах LINQ. Приведенный ниже запрос LINQ ссылается на другую таблицу CustomerUserField :

from c in Customer.GetCustomer(this.ClientId, intRecordId)
select new
{
  c.TitleId,
  c.FirstName,
  c.LastName,
  c.Phone,
  c.MobilePhone,
  c.Fax,
  c.EmailAddress,
  c.CustomerUserField.Text1,
  c.CustomerUserField.Text2,
  c.CustomerUserField.Text3,
  c.CustomerUserField.Text4,
  c.CustomerUserField.Text5
};

В C # это выглядит красиво и аккуратно, однако сгенерированный SQL создает отдельное левое внешнее соединение для каждого столбца в ссылочной таблице:

SELECT 
[Limit1].[C1] AS [C1], 
[Limit1].[TitleId] AS [TitleId], 
...
FROM                                 
    [dbo].[Customer] AS [Extent1]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent2] ON [Extent1].[CustomerId] = [Extent2].[CustomerId]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent9] ON [Extent2].[CustomerUserFieldId] = [Extent9].[CustomerUserFieldId]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent10] ON [Extent2].[CustomerUserFieldId] = [Extent10].[CustomerUserFieldId]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent11] ON [Extent2].[CustomerUserFieldId] = [Extent11].[CustomerUserFieldId]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent12] ON [Extent2].[CustomerUserFieldId] = [Extent12].[CustomerUserFieldId]
    LEFT OUTER JOIN [dbo].[CustomerUserField] AS [Extent13] ON [Extent2].[CustomerUserFieldId] = [Extent13].[CustomerUserFieldId]...

Этот SQL очень медленный, так как требуется только 1 левое внешнее соединение. Любые идеи, как я могу изменить свой LINQ, чтобы выполнить только одно соединение?

Заранее спасибо!

Энтони.

1 Ответ

0 голосов
/ 20 апреля 2009

Вы можете «загрузить» свою таблицу опций клиента, используя следующий код:

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<Customer>(c => c.CustomerUserField);

using (ToDoDataContext context = new ToDoDataContext())
{
    context.LoadOptions = options;
    //Your code goes here
}

Это должно означать, что ваше объединение выполняется только один раз, так как оно загружает таблицу одновременно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...