2015-07-10 3 views
1

У меня есть сомнения в запросе, что он немного медленный, и я хочу знать, что лучше для производительности.Производительность в linq для запросов сущностей между linq и лямбдой?

Представим это первый пример:

var result = from tableA in context.TableA 
      join tableB in context.TableB on tableA.id equals tableB.id 
      where *some conditions* 
      select new { 
       tableA.id, 
       tableA.name, 
       another_name = tableA.TableC.name 
       some_operation = tableB.price * tableB.TableD.some_coeficient 
       another_operation = tableB.TableE.Sum(c=> c.some_value) 
      }; 

Это то, что я есть сейчас (после этого запроса я выполнить в другой переменной а result.ToList()

Mi вопрос, если бы лучше в уровнях. производительность сделать:.

  1. запрос с лямбда-выражений сохраняя select new {....} часть
  2. Запрос с номером select new {....} после ToList()?

Что вы рекомендуете мне делать?

+0

Ваше предложение where может иметь большое значение, если оно превращается в нечто, что SQL-сервер не может найти с индексом или не имеет индекса, он может убить производительность. – Mant101

ответ

3
  1. Было бы точно так же. Выражения запроса в основном преобразуются в эквивалент выражения без запроса.

  2. Вы должны были бы использовать select new { tableA, tableB } или что-то подобное в любом случае, так что вы можете использовать обе переменные после ToList ... но это, вероятно, будет медленнее как тогда:

    • Все поля будет вытащить из базы данных, а не только те, которые используются
    • Проецирования (включая Sum и т. д.) произойдут после, получая значения из базы данных, а не из базы данных. Это очень вероятно, будет включать делать больше запросов к базе данных, чтобы получить доступ к tableA.TableC и т.д.

Вы должны смотреть на сгенерированного SQL, запустить его в SQL Profiler, чтобы выяснить, что это медленно, рассмотрим несколько индексов и т.д.

+0

Что лучше в запросе, выполните вложения в 'select new', например' tableA.TableC', или выполните 'join' в запросе с помощью' TableC'? –

+0

@Phoeniz_uy: Я предлагаю вам попробовать оба, проверить как SQL, так и производительность ... –

3

Изменение его на лямбда-выражения не повлияет на производительность - они будут скомпилированы в один и тот же SQL. Я рекомендую использовать такой инструмент, как LinqPad, чтобы помочь определить генерируемый SQL.

Вы определенно хотите сделать selectпередToList() Ing, хотя, как это будет только выбрать нужные данные из SQL, но сделать это после ToList() бы сделать это в памяти.

+1

Во-вторых, использование LinqPad, безусловно, самый быстрый способ настройки запросов Linq. – Mant101

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