Csharp/C#教程:LINQ生成子查询的简单顺序分享


LINQ生成子查询的简单顺序

我无法理解为什么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 

我正在使用的一些东西:

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

与其他人一样,查询会产生与您相同的执行计划。 entity framework(和LINQ to Entites)可以帮助您避免编写SQL并在某种程度上打扰SQL。 在正常情况下,您不关心生成SQL,也不“调试”它。 你只关心LINQ查询是否正确。 entity framework(应该)将其转换为正确的(有时甚至是预期的)SQL(再次,执行计划很重要)。

我不是说你出于性能原因不应该看SQL(或者更好地说出该查询的执行计划)。 但是, 确定性能问题 ,应该这样做。 你应该首先尝试简单地编写查询,这是成功的方法。 当然,如果你知道SQL,你知道这个集合世界与对象世界不同 – 你可以在LINQ中轻松编写相当普通的查询(感谢对象世界),但这最终会因为“令人讨厌的SQL(设置世界)而因为”世界之间的不匹配。

上述就是C#学习教程:LINQ生成子查询的简单顺序分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/1026359.html

(0)
上一篇 2022年1月9日
下一篇 2022年1月9日

精彩推荐