C# 使用LINQ编写案例语句(使用GROUPBY)

C# 使用LINQ编写案例语句(使用GROUPBY),c#,.net,sql,linq,entity-framework,C#,.net,Sql,Linq,Entity Framework,我真的在和林克斗争。我已经用SQL编写了我的查询(实际上它是一个pivot),并试图用LINQ编写一个等价的语句。任何向前的指示都将不胜感激。代码见下文: SELECT b.URL, SUM(CASE WHEN (a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntLinks, SUM(CASE WHEN (a.ResponseCode >= 400 AND a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntBroken, S

我真的在和林克斗争。我已经用SQL编写了我的查询(实际上它是一个pivot),并试图用LINQ编写一个等价的语句。任何向前的指示都将不胜感激。代码见下文:

SELECT b.URL,
SUM(CASE WHEN (a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntLinks,   
SUM(CASE WHEN (a.ResponseCode >= 400 AND a.ExtFlag = 0) THEN 1 ELSE 0 END) AS IntBroken,
SUM(CASE WHEN (a.ExtFlag = 1) THEN 1 ELSE 0 END) AS ExtLinks,   
SUM(CASE WHEN (a.ResponseCode >= 400 AND a.ExtFlag = 1) THEN 1 ELSE 0 END) AS ExtBroken
FROM Link a
INNER JOIN Host b
ON a.HostID = b.ID
GROUP BY b.URL
ORDER BY b.URL

非常感谢。

我认为这应该是你想要的——至少值得一试:

var query = from link in db.Links
            join host in db.Hosts on link.HostID equals host.ID
            group link by host.Url into links
            select new
            {
                Url = links.Url,
                IntLinks  = links.Count(link => link.ExtFlag == 0),
                IntBroken = links.Count(link => link.ExtFlag == 0 &&
                                                link.ResponseCode >= 400),
                ExtLinks =  links.Count(link => link.ExtFlag == 1),
                ExtBroken = links.Count(link => link.ExtFlag == 1 &&
                                                link.ResponseCode >= 400),
            };
这是如何做到的:

from a in db.Links
group a by a.Host.Url into g
select new
{
    Url = g.Key,
    IntLinks = (
        from x in g
        select x.ExtFlag == 0 ? 1 : 0)
        .Sum()
};

您可以对您的
案例使用
?:
运算符

为什么要将其重写为LINQ?您可以直接使用SQL并通过EF执行它。我可以吗?怎么用?我是.Net新手:(在您的上下文类上,您有方法。只需创建具有
URL
IntLinks
Intbreak
ExtLinks
extbreak
属性的类,您就可以使用该方法从命令中获取这些类的集合。