2013-10-05 2 views
7

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

var list = db.User.Where(u => u.Name == somename).OrderBy(u => u.IdUser).ToList(); 

где SomeName является параметром я передаю во время выполнения.

Выход SQL является:

SELECT 
Project1.IdUser, 
Project1.Name 
FROM (SELECT 
Extent1.IdUser, 
Extent1.Name 
FROM user AS Extent1 
WHERE Extent1.Name = 'John' /* @p__linq__0 */) AS Project1 
ORDER BY 
Project1.IdUser ASC 

Если выход действительно есть подзапрос для чего-то, что просто?

Я также попытался

var list = db.User.Where(u => u.Name.Equals(somename)).OrderBy(u => u.IdUser).ToList(); 

, который генерирует такой же вывод, как указано выше.

Если я жесткий код параметра, например:

var list = db.User.Where(u => u.Name == "John").OrderBy(u => u.IdUser).ToList(); 

Он работает, как ожидалось, генерируя только

SELECT 
Extent1.IdUser, 
Extent1.Name 
FROM user AS Extent1 
WHERE 'John' /* @gp1 */ = Extent1.Name 
ORDER BY 
Extent1.IdUser ASC 

Несколько вещей я использую:

  • EntityFramework 5 , .NET 4.5
  • SQL Server 2012
  • Glimpse (который использует MiniProfiler), чтобы увидеть SQL генерироваться

Я не эксперт LINQ, так что я здесь отсутствует?

+2

Есть ли разница в плане запроса между двумя? – Laurence

+0

Нет, они разрешают один и тот же план выполнения, но этот синтаксис меня пугает. Представьте себе, если я отлаживаю более сложный запрос, созданный LINQ со всей этой ненужной сложностью, он не будет продуктивным. –

+0

Абстракция поставляется со стоимостью. Если вам не нравится стоимость, тогда напишите SQL самостоятельно. Из этих выборов нет правильной или неправильной стороны. – Laurence

ответ

2

Как и другие указатели, запрос приводит к такому же плану выполнения, что и ваш. Entity Framework (и LINQ to Entites) здесь, чтобы помочь вам избежать написания SQL и беспокоиться о SQL (в некоторой степени). В нормальных условиях вам неважно, генерируется SQL, и вы не «отлаживаете» его. Вам просто интересно, корректен ли запрос LINQ. Entity Framework (должен) переводит его в правильный (иногда даже ожидаемый) SQL (и, опять же, план выполнения имеет значение).

Я не говорю, что вы не должны смотреть на SQL по соображениям производительности (или, лучше сказать, план выполнения этого запроса). Но это должно быть сделано после Вы обнаружили проблемы с производительностью. И вы должны сначала попросить написать простой, это путь к успеху. Конечно, если вы знаете SQL, вы знаете, что этот мир наборов отличается от мира объекта - вы можете легко писать довольно средний запрос в LINQ (благодаря объектам мира), но это закончится как неприятный SQL (устанавливает мир) из-за " несоответствие "между мирами.

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