[c#]Sql 是快速而转换为 linq 时慢

标签: sql Linq SQLServer C#
发布时间: 2017/2/26 17:43:40
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

这是快速

SELECT Foo,
       count(*)
FROM
  (SELECT Foo
   FROM MyTable
   GROUP BY Foo,
            Bar,
            Baz) AS Subquery
GROUP BY Foo

这是快速

var query = from fooGrp in
    (from rv in _myRepository.AsQueryable()
        group rv by new {rv.Foo, rv.Bar, rv.Baz}
        into grp
        select grp)
    group fooGrp by fooGrp.Key.Foo
    into grp2
    select new {grp2.Key, Count = grp2.Count()};
query.ToDictionary(x => x.Key, x => x.Count);

这是真的很慢的 !

_myRepository.AsQueryable()
    .GroupBy(x => new { x.Foo, x.Bar, x.Baz })
    .GroupBy(x => x.Key.Foo)
    .ToDictionary(x => x.Key, x => x.Count());

我不明白:( 两个 linq 表达式之间的区别是什么?他们都返回预期的结果集。


第一个表达式 (快速) 生成的 SQL 是︰

SELECT 
    1 AS [C1], 
    [GroupBy1].[K1] AS [Foo], 
    [GroupBy1].[A1] AS [C2]
    FROM ( SELECT 
        [Distinct1].[Foo] AS [K1], 
        COUNT(1) AS [A1]
        FROM ( SELECT DISTINCT 
            [Extent1].[Foo] AS [Foo], 
            [Extent1].[Bar] AS [Bar], 
            [Extent1].[Baz] AS [Baz]
            FROM [dbo].[MyTable] AS [Extent1]
        )  AS [Distinct1]
        GROUP BY [Distinct1].[Foo]
    )  AS [GroupBy1]

对于第二个表达式 (慢) 生成的 SQL 是︰

是这么长时间,它超出这篇文章,所以不能张贴它:/ 的字符限制

解决方法 1:

所以原来 LINQ 表达式都不相同。

正确的 linq 表达式为︰

_myRepository.AsQueryable()
    .GroupBy(x => new {x.Foo, x.Bar, x.Baz})
    .GroupBy(x => x.Key.Foo)
    .Select(x => new {x.Key, Count = x.Count()})
    .ToDictionary(x => x.Key, x => x.Count);

我缺掉的选择,我完全没有想到,因为在正常的 SQL 中你只能选择组由子句中的列上。但是 LINQ 做各种魔法要包括的列,休息,除非您在选择限制它。

官方微信
官方QQ群
31647020