Группировать данные на 2 поля, используя LINQ - PullRequest
0 голосов
/ 19 октября 2018

У меня есть некоторые данные, поступающие из базы данных, которые я хотел бы сгруппировать особым образом, используя LINQ, но я изо всех сил пытаюсь заставить группировку работать так, как нужно.Вот подробности.

У меня есть два класса C #, которые являются моими моделями представления:

public class RawTrackerDataViewModel
{
    public int questionnaireId { get; set; }

    public string dateCompleted { get; set; }

    public int coachNodeId { get; set; }

    public int youngPersonNodeId { get; set; }

    public int questionIndex { get; set; }

    public int questionNodeId { get; set; }

    public int score { get; set; }

    public string coachName { get; set; }

    public string youngPersonName { get; set; }
}

public class ProcessedTrackerDataViewModel
{
    public string name { get; set; }

    public List<RawTrackerDataViewModel> data { get; set; }
}

Затем у меня есть контроллер веб-API, извлекающий данные из базы данных и отображающий данные в представлениемодели (использующие «микро» ORM PetaPoco), такие как:

    public List<ProcessedTrackerDataViewModel> GetData()
    {
        var db = ApplicationContext.Current.DatabaseContext.Database;
        var questionnaires = db.Query<RawTrackerDataViewModel>("SELECT Questionnaire.id AS questionnaireId, DATEDIFF(second,{ d '1970-01-01'},dateCompleted) AS dateCompleted, coachNodeId, youngPersonNodeId, questionIndex, questionNodeId, score, coachNode.[text] AS coachName, youngPersonNode.[text] AS youngPersonName FROM Questionnaire INNER JOIN Answer ON Questionnaire.id = Answer.questionnaireId LEFT JOIN umbracoNode AS coachNode ON Questionnaire.coachNodeId = coachNode.id LEFT JOIN umbracoNode AS youngPersonNode ON Questionnaire.youngPersonNodeId = youngPersonNode.id; ").ToList();
        var groups = questionnaires.GroupBy(x => x.questionnaireId);

        var data = new List<ProcessedTrackerDataViewModel>();

        foreach (var group in groups)
        {
            var newItem = new ProcessedTrackerDataViewModel();
            newItem.name = group.First().youngPersonName;
            newItem.data = group.ToList();
            data.Add(newItem);
        }

        return data;
    }

Данные, возвращаемые из необработанного SQL-запроса, выводят что-то вроде этого (все фиктивные данные), просто чтобы дать представление о том, с чем мы имеем дело:

enter image description here

Когда я вызываю контроллер через интерфейсный вызов API, он почти делает то, что мне нужно.Он извлекает данные анкеты, сгруппированные по идентификатору анкеты, например так (обратите внимание, я расширил один из узлов «данных», чтобы продемонстрировать возвращаемые данные):

enter image description here

Пока все хорошо.

Однако теперь я хочу сгруппировать возвращаемые данные на основе 'youngPersonNodeId' так, чтобы для 'Adam Greenall' был только один объект, содержащий массив данных.из 25 предметов, один объект для 'Jamie Smith', содержащий 5 элементов данных, один объект для Zak, содержащий 15 элементов данных и т. д.

Я пробовал группировать по questionnaireId и youngPersonNodeId, но это неКажется, что ничего не изменилось:

 var groups = questionnaires.GroupBy(x => new { x.questionnaireId, x.youngPersonNodeId });

Может ли кто-нибудь помочь с тем, как заставить работать эту последнюю группу?

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

1 Ответ

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

Вам нужно сгруппировать только по youngPersonNodeId, а не по questionnaireId

var groups = questionnaires.GroupBy(x => new { x.youngPersonNodeId });

ИЛИ

var groups = questionnaires.GroupBy(x => x.youngPersonNodeId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...