linq to sql complex query with group by

时间:2011-02-19 16:14:52

标签: c# linq-to-sql group-by

我有一张名为“文章”的表。

它包括以下字段:

ArticleIndex,ArticleLevel,ArticleParentIndex。

我查询了返回ArticleLevel = 1的所有文章 - 让我们称之为query1。 返回ArticleLevel = 2 - query2。

的所有文章的查询

我希望有一个查询,它会返回level = 1的文章,至少有一篇子文章(子文章的级别为2),以及子文章的数量。

到目前为止,我有以下查询:

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

然后,为了获得level = 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 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

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