Написание падежных операторов с использованием LINQ (с GROUP BY) - PullRequest
3 голосов
/ 13 февраля 2012

Я действительно борюсь с LINQ. Я написал свой запрос в SQL (по сути, это сводная точка) и пытаюсь написать эквивалентное утверждение в 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

Большое спасибо.

Ответы [ 2 ]

9 голосов
/ 13 февраля 2012

Я думаю, что это должно делать то, что вы хотите - по крайней мере, стоит попробовать:

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),
            };
2 голосов
/ 13 февраля 2012

Вот как это сделать:

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()
};

Вы можете использовать оператор ?: для вашего CASE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...