gpt4 book ai didi

sql-server-2008 - 为什么Linq2SQL生成嵌套查询而不是使用JOIN?

转载 作者:行者123 更新时间:2023-12-04 19:40:54 24 4
gpt4 key购买 nike

我试图理解为什么Linq生成用于以下语句的SQL:

var dlo = new DataLoadOptions();
dlo.LoadWith<TemplateNode>(x => x.TemplateElement);
db.LoadOptions = dlo;

var data = from node in db.TemplateNodes
where node.TemplateId == someValue
orderby node.Left
select node;


生成以下SQL:

SELECT [t2].[Id],
[t2].[ParentId],
[t2].[TemplateId],
[t2].[ElementId],
[t2].[Left] AS [Left],
[t2].[Right] AS [Right],
[t2].[Id2],
[t2].[Content]
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [t0].[Left]) AS [ROW_NUMBER],
[t0].[Id],
[t0].[ParentId],
[t0].[TemplateId],
[t0].[ElementId],
[t0].[Left],
[t0].[Right],
[t1].[Id] AS [Id2],
[t1].[Content]
FROM [dbo].[TemplateNode] AS [t0]
INNER JOIN [dbo].[TemplateElement] AS [t1]
ON [t1].[Id] = [t0].[ElementId]
WHERE [t0].[TemplateId] = 16 /* @p0 */) AS [t2]
WHERE [t2].[ROW_NUMBER] > 1 /* @p1 */
ORDER BY [t2].[ROW_NUMBER]


TemplateNode.ElementIdTemplateElement.Id有一个外键。

我本来希望查询产生一个 JOIN,如下所示:

SELECT * FROM TemplateNode
INNER JOIN TemplateElement ON TemplateNode.ElementId = TemplateElement.Id
WHERE TemplateNode.TemplateId = @TemplateId


根据 the answers to this question中的建议,我已经对两个查询进行了概要分析,并且JOIN比嵌套查询快3倍。

我正在使用.NET 4.0 Windows Forms应用程序来测试SQL Server 2008 SP2 64位开发人员版本。

最佳答案

LINQ-SQL生成ROW_NUMBER查询的唯一原因是由于Skip方法。就像上面的SQL看起来一样,我想在T-SQL中没有像MySQL的Limit 10,25这样的简单分页结构,因此在使用SkipTake时会得到上面的SQL。

我假设有一个Skip用于分页,而LINQ-SQL正在修改查询。如果使用LINQ-Pad之类的应用程序,则可以运行不同的LINQ查询以查看其生成的SQL。

关于sql-server-2008 - 为什么Linq2SQL生成嵌套查询而不是使用JOIN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9666301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com