У меня возникли проблемы с пониманием того, почему вывод 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, так что я здесь отсутствует?
Есть ли разница в плане запроса между двумя? – Laurence
Нет, они разрешают один и тот же план выполнения, но этот синтаксис меня пугает. Представьте себе, если я отлаживаю более сложный запрос, созданный LINQ со всей этой ненужной сложностью, он не будет продуктивным. –
Абстракция поставляется со стоимостью. Если вам не нравится стоимость, тогда напишите SQL самостоятельно. Из этих выборов нет правильной или неправильной стороны. – Laurence