8

我无法理解为什么 SQL 输出有一个我在 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

我正在使用的一些东西:

  • 实体框架 5、.NET 4.5
  • SQL Server 2012
  • Glimpse(使用 MiniProfiler)查看生成的 SQL

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

4

1 回答 1

2

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

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

于 2013-10-06T09:01:45.540 回答