LINQ生成子查询的简单顺序

Mah*_*Ali 7 c# sql sql-server entity-framework

我无法理解为什么SQL输出具有我在LINQ中编写的简单查询的子查询.这是我的代码:

var list = db.User.Where(u => u.Name == somename).OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

输出真的应该有一个简单的子查询吗?

我也试过了

var list = db.User.Where(u => u.Name.Equals(somename)).OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)

它产生与上面相同的输出.

如果我对参数进行硬编码,例如:

var list = db.User.Where(u => u.Name == "John").OrderBy(u => u.IdUser).ToList();
Run Code Online (Sandbox Code Playgroud)

它按预期工作,仅生成

SELECT
Extent1.IdUser, 
Extent1.Name
FROM user AS Extent1
WHERE 'John' /* @gp1 */ = Extent1.Name
ORDER BY 
Extent1.IdUser ASC
Run Code Online (Sandbox Code Playgroud)

我正在使用的一些东西:

  • EntityFramework 5,.NET 4.5
  • SQL Server 2012
  • Glimpse(使用MiniProfiler)查看生成的SQL

我不是LINQ专家,所以我在这里缺少什么?

cin*_*net 2

正如其他指出的,查询结果与您的执行计划相同。Entity Framework(和 LINQ to Entites)可以帮助您避免编写 SQL 并为 SQL 烦恼(在某种程度上)。在正常情况下,您不关心 SQL 的生成,也不“调试”它。您只关心 LINQ 查询是否正确。实体框架(应该)将其转换为正确的(有时甚至是预期的)SQL(同样,执行计划很重要)。

我并不是说出于性能原因(或者更好地说是该查询的执行计划),您不应该查看 SQL。但这应该在您发现性能问题之后完成。并且您应该首先尝试编写简单的查询,这才是成功之道。当然,如果您了解 SQL,您就会知道这个集合世界与对象世界不同 - 您可以在 LINQ 中轻松编写相当普通的查询(感谢对象世界),但这最终会成为令人讨厌的 SQL(集合世界),因为“世界之间的不匹配”。