将Linq转换为Sql查询到更好的sql

时间:2014-03-29 21:04:04

标签: c# sql sql-server linq

所以我需要一些带有SQL查询。从linq生成的sql似乎非常低,并且存储过程超时。

这是我想要做的事情。

两个表,如下所示:

dbo.Links
-------------
Id
Url
Title

另一个看起来像这样的人

dbo.Link_Counts
-----------------
Url
Count

我想做的是写一个执行此操作的SQL查询

var linkCounts = Links.GroupBy(x => x.Url)
                 .Select(grp => new Link_Counts 
                  {
                      Url = grp.First().Url,
                      Count = grp.Count()
                  });

InsertAllOnSubmit(linkCounts);
SubmitChanges();

我尝试使用的sql部分是由

生成的
    INSERT INTO Link_Counts (Url, Count)
SELECT (
    SELECT [t3].[URL]
    FROM (
        SELECT TOP (1) [t2].[URL]
        FROM [Links] AS [t2]
        WHERE (([t1].[URL] IS NULL) AND ([t2].[URL] IS NULL)) OR (([t1].[URL] IS NOT NULL) AND ([t2].[URL] IS NOT NULL) AND ([t1].[URL] = [t2].[URL]))
        ) AS [t3]
    ) AS [Url], [t1].[value] AS [Count]
FROM (
    SELECT COUNT(*) AS [value], [t0].[URL]
    FROM [Links] AS [t0]
    GROUP BY [t0].[URL]
    ) AS [t1]
END

对于存储过程显然运行时间过长。

任何帮助都会很棒。

由于

2 个答案:

答案 0 :(得分:3)

如果你想手工编写SQL:

insert into link_counts (url, count)
select url, count(0)
from links
group by url

或者,如果您只想修复LINQ查询以生成更好的SQL:

var linkCounts = 
    Links.GroupBy(x => x.Url)
         .Select(g => new Link_Counts
             {
                 Url = g.Key,
                 Count = g.Count()
             };

答案 1 :(得分:2)

我认为这是您为每个网址插入计数所需的内容:

insert into Link_Counts (Url, Count)
select Url, Count(*)
from dbo.Links
group by Url