C# LINQ к объектам подсчета элементов во вложенной таблице - PullRequest
0 голосов
/ 04 мая 2020

Как получить в result number сообщений в каждом Category? Пример:

Category 0, 10
Category 1, 10

Программа:

namespace Query
{
    class Program
    {
        static void Main(string[] args)
        {
            var Categories = new List<Category>();

            FillCategories(Categories);

            var result = from category in Categories
                         from forum in category.Forums
                         from topic in forum.Topics
                         from post in topic.Posts
                         where category.Id == forum.CategoryId
                         && forum.Id == topic.ForumId
                         && topic.Id == post.TopicId
                         group new { category, post } by new { category.Name } into resultSet
                         select new
                         {
                             resultSet.Key.Name
                         };
        }

        private static void FillCategories(List<Category> Categories)
        {
            for (int categoryId = 0; categoryId < 10; categoryId++)
            {
                Category category = new Category();
                category.Id = categoryId;
                category.Name = "Category " + categoryId;
                for (int forumId = 0; forumId < 10; forumId++)
                {
                    Forum forum = new Forum();
                    forum.CategoryId = categoryId;
                    forum.Id = forumId;
                    forum.Name = "Forum " + forumId;

                    for (int topicId = 0; topicId < 10; topicId++)
                    {
                        Topic topic = new Topic();
                        topic.AspNetUserId = "Some User";
                        topic.DateTime = DateTime.Now;
                        topic.Id = topicId;
                        topic.Title = "Some title";
                        topic.ForumId = forumId;
                        for (int postId = 0; postId < 100; postId++)
                        {
                            Post post = new Post();
                            post.AspNetUserId = "Some user";
                            post.DateTime = DateTime.Now;
                            post.Id = postId;
                            post.Message = "Some message" + postId;
                            post.TopicId = topicId;
                            topic.Posts.Add(post);
                        }
                        forum.Topics.Add(topic);
                    }
                    category.Forums.Add(forum);
                }
                Categories.Add(category);
            }
        }
    }

    public class Category
    {
        public Category()
        {
            Forums = new List<Forum>();
        }

        public long Id { get; set; }
        public string Name { get; set; }
        public virtual List<Forum> Forums { get; set; }
    }
    public class Forum
    {
        public Forum()
        {
            Topics = new List<Topic>();
        }

        public long Id { get; set; }
        public string Name { get; set; }
        public long CategoryId { get; set; }
        public virtual List<Topic> Topics { get; set; }
    }

    public class Topic
    {
        public Topic()
        {
            Posts = new List<Post>();
        }

        public long Id { get; set; }
        public string AspNetUserId { get; set; }
        public string Title { get; set; }
        public DateTime DateTime { get; set; }
        public long ForumId { get; set; }
        public virtual List<Post> Posts { get; set; }
    }

    public class Post
    {
        public long Id { get; set; }
        public string Message { get; set; }
        public DateTime DateTime { get; set; }
        public long TopicId { get; set; }
        public string AspNetUserId { get; set; }
    }
}

1 Ответ

1 голос
/ 04 мая 2020

Добавление количества для каждого resultSet в конце вашего запроса должно дать вам правильное значение, равное 10000. В каждой категории есть 10 форумов, в которых есть 10 тем для каждого форума и 100 сообщений для каждой топи c, всего 10 тыс. Элементов для каждой категории

select new
{
    resultSet.Key.Name,
    Count = resultSet.Count()
};

where условие в Ваш запрос выглядит избыточным, так как вы смотрите только нижестоящие коллекции. Это можно переписать немного

var result = from category in Categories
             from forum in category.Forums
             from topic in forum.Topics
             from post in topic.Posts
             group new { category, post } by new { category.Name } into resultSet
             select new
             {
                 resultSet.Key.Name,
                 Count = resultSet.Count()
             };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...