LINQ to SQL сложный запрос с группировкой по - PullRequest
0 голосов
/ 19 февраля 2011

У меня есть таблица под названием «Статьи».

включает в себя следующее поле:

ArticleIndex, ArticleLevel, ArticleParentIndex.

Я сделал запрос, который возвращает все статьи с ArticleLevel = 1 - назовем его query1. Запрос, который возвращает все статьи с ArticleLevel = 2 - query2.

Я хотел бы получить запрос, который бы возвращал Статьи уровня = 1 с хотя бы одной дочерней статьей (дочерние статьи имеют уровень = 2), а также количество дочерних статей.

Пока у меня есть следующий запрос:

var filteredItemsGrouped = from i in filteredItems
                           group i by i.ArticleParentIndex into g
                           select new { Node = g, NodeItemsCount = g.Count() };

и затем, чтобы получить реальные статьи с уровнем = 1, я делаю:

IList<ArticleNodeInfo> Nodes = new List<ArticleNodeInfo>();
        foreach (var node in filteredItemsGrouped)
        {
            Nodes.Add(new ArticleNodeInfo
            {
                Node = articlesService.GetArticleByIndex((int)(node.Node.FirstOrDefault().ArticleParentIndex)),
                NodeItemsCount = node.NodeItemsCount
            });
        }

Этот процесс слишком дорогой. Можно ли добиться того же самого одним запросом (вместо того, чтобы каждый раз получать по индексу статьи)?

Надеюсь, я достаточно ясно ...

1 Ответ

1 голос
/ 19 февраля 2011

это должно сработать:

    var articlesLevel1 = (
            from al1 in Articles
            join al2 in Articles on new
            {
                    al1.ArticleIndex,
                    ArticleLevel = 2
            } equals new
            {
                    ArticleIndex = al2.ArticleParentIndex,
                    al2.ArticleLevel
            } into g_al2
            where (al1.ArticleLevel == 1) && g_al2.Any()
            select new
            {
                    ArticlesLevel1 = al1,
                    ArticlesLevel2Count = g_al2.Count()
            });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...