Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# LINQtoSQL为类似的GROUPBY表达式生成不同的查询_C#_Entity Framework_Linq_Linq To Sql_Group By - Fatal编程技术网

C# LINQtoSQL为类似的GROUPBY表达式生成不同的查询

C# LINQtoSQL为类似的GROUPBY表达式生成不同的查询,c#,entity-framework,linq,linq-to-sql,group-by,C#,Entity Framework,Linq,Linq To Sql,Group By,我注意到,在LINQtoSQL中使用GroupBy时,将引用Id作为键与使用实际导航属性作为键在结果查询中存在差异 例1: Employees.GroupByx=>x.CompanyId.Selectg=>g.Count 结果SQL: SELECT COUNT(*) AS [value] FROM [Employees] AS [t0] GROUP BY [t0].[CompanyId] SELECT [t1].[value] FROM ( SELECT COUNT(*) AS [va

我注意到,在LINQtoSQL中使用GroupBy时,将引用Id作为键与使用实际导航属性作为键在结果查询中存在差异

例1: Employees.GroupByx=>x.CompanyId.Selectg=>g.Count

结果SQL:

SELECT COUNT(*) AS [value]
FROM [Employees] AS [t0]
GROUP BY [t0].[CompanyId]
SELECT [t1].[value]
FROM (
    SELECT COUNT(*) AS [value], [t0].[DivisionDeductionID]
    FROM [CheckDeductions] AS [t0]
    GROUP BY [t0].[DivisionDeductionID]
) AS [t1]
LEFT OUTER JOIN [DivisionDeductions] AS [t2] ON [t2].[DivisionDeductionID] = [t1].[DivisionDeductionID]
例2: Employees.GroupByx=>x.Company.Selectg=>g.Count

结果SQL:

SELECT COUNT(*) AS [value]
FROM [Employees] AS [t0]
GROUP BY [t0].[CompanyId]
SELECT [t1].[value]
FROM (
    SELECT COUNT(*) AS [value], [t0].[DivisionDeductionID]
    FROM [CheckDeductions] AS [t0]
    GROUP BY [t0].[DivisionDeductionID]
) AS [t1]
LEFT OUTER JOIN [DivisionDeductions] AS [t2] ON [t2].[DivisionDeductionID] = [t1].[DivisionDeductionID]

看看示例2,很明显,除了左连接本身之外,从未使用过[t2]。为什么LINQtoSQL没有检测到这一点,而只是使用与示例1相同的查询?无论如何,它是按ID字段分组的。

这看起来像是EF的SQL生成器错过了优化查询的机会:事实上,由于[t2]没有在外部联接之外使用,它可能会与嵌套的select一起被丢弃

EF编写者似乎为[t2]添加了一个联接,因为他们不想区分以下两种情况:1导航属性仅用于其主键,因此可以使用相应的FK替换;2查询实际从中提取其他字段

考虑到RDBMS优化了不必要的连接,这种做法是完全合理的