2010-12-07 4 views
2

у меня есть это Linq To SQL-запрос:Как оптимизировать этот запрос linq?

var items = 
    from i in context.Items 
    orderby i.itemId descending 
    select new ItemWithCategories 
    { 
     item = i, 
     categories = (
      from cats in context.categories 
      join ic in context.itemCategories 
       on cats.categoryId equals ic.categoryId 
      where ic.itemId == i.itemId 
      select cats).ToList() 
    }; 

Это в три таблицы. Мне нужно присоединиться к категориям с элементами, но есть таблица между ними (многие-ко-многим). Есть ли лучший способ сделать этот запрос?

+1

Вы изучили сгенерированный sql и их планы запросов? – 2010-12-07 20:18:39

ответ

1

Это дает те же результаты, но намного легче читать:

var items = 
    from item in context.Items 
    orderby item.itemId descending 
    select new ItemWithCategories 
    { 
     item = item, 
     categories = (
      from itemCategory in item.itemCategories 
      select itemCategory.category).ToList() 
    }; 

Посмотрите, как я удалил заявление присоединиться, но используя itemCategories свойство item?

0

Запрос, который у вас есть, создаст список объектов, которые будут иметь ссылки на запросы (категории), которые затем будут выполняться при их доступе (если они вообще есть).

Это может вызвать много «болтовни» между клиентом и сервером базы данных, а также дополнительные накладные расходы на отправку данных заголовка повторно через ваш поток TDS.

Возможно, вы захотите рассмотреть возможность соединения и сглаживания данных здесь. Это потребует всего лишь одного поиска, за счет репликации данных с левой стороны (элементов).

Конечно, при любой оптимизации ключ должен тестировать, тестировать, тестировать.

Смежные вопросы