Преобразование сбора данных во вложенный иерархический список объектов - PullRequest
0 голосов
/ 26 октября 2018

Я хочу сделать вызов API, который получает все уникальные идентификаторы опроса и помещает их в массив с общим количеством ответов на основе уникального значения ответа и списка идентификаторов пользователей. Например: ICollection<Survey>

ID Survey_Id       Answer  User
1  Apple_Survey    1       Jones
2  Apple_Survey    1       Smith
3  Banana_Survey   2       Smith
4  Apple_Survey    3       Jane
5  Banana_Survey   2       John

Результат API, который у меня сейчас есть:

{Data: [
  {
      survey_id: "Apple_Survey",
      answer: "1",
      user: "Jones"
  },
  ...
]}

Я застрял в коде для обработки данных:

foreach (var info in data
                     .GroupBy(x => x.Survey_Id)
                     .Select(group => new { SurveyId = group.Key, 
                                          Count = group.Count() }) )
{
    Console.WriteLine("{0} {1}", info.SurveyId, info.Count); 
    //Result: Apple_Survey 3 Banana_Survey 2
}

Идеальные результаты:

{Data: [
  {
      survey_id: "Apple_Survey",
      answers: [//Example: rating answer would be 1-10, not an ID
             {answer: "1", count: 2, users: ["Jones", "Smith"]},
             {answer: "3", count: 1, users: ["Jane"]}
      ]
   },
   ...
]}

Как я могу получить четкие ответы на основе survey_id и списка пользователей на основе ответа? Любая помощь будет принята с благодарностью!

Ответы [ 3 ]

0 голосов
/ 26 октября 2018

Я бы пошел на

table.GroupBy( x => x.Survey_Id ).Select( x => new { Survey_Id=x.Key, Answers=x.GroupBy( y => y.Answer ).Select( y => new { Answer=y.Key, Count=y.Count(), Users=y.Select( z => z.User)})} )

Это создает бесчисленное множество пар опроса и бесчисленное количество ответов, каждое со своим количеством и бесчисленное количество пользователей, которые проголосовали за этот ответ.

Попробуйте на dotnetfiddle.net !

0 голосов
/ 26 октября 2018

Посмотрите, поможет ли следующее:

   class Program
    {
        static void Main(string[] args)
        {
            List<Survey> surveys = new List<Survey>() {
                new Survey() { ID = 1, Survey_Id = "Apple_Survey", Answer = 1,  User = "Jones"},
                new Survey() { ID = 2, Survey_Id = "Apple_Survey", Answer = 1,  User = "Smith"},
                new Survey() { ID = 3, Survey_Id = "Banana_Survey", Answer = 2,  User = "Smith"},
                new Survey() { ID = 4, Survey_Id = "Apple_Survey", Answer = 3,  User = "Jane"},
                new Survey() { ID = 5, Survey_Id = "Banana_Survey", Answer = 2,  User = "John"}
            };

            var results = surveys.GroupBy(x => x.Survey_Id).Select(x => x.GroupBy(y => y.Answer)
                .Select(y => new { answer = y.Key, count = y.Count(), users = y.Select(z => z.User).ToList()}).ToList())
                .ToList();
        }

    }
    public class Survey
    {
        public int ID { get; set; }
        public string Survey_Id { get; set; }
        public int Answer { get; set; }
        public string User { get; set; }
    }
0 голосов
/ 26 октября 2018

Простой способ основан только на SQL. Вы можете использовать запрос как:

select Survey_Id, Answer, COUNT(*)  answer_count, group_concat(user) answer_user
from my_table  
group  Survey_Id, Answer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...