У меня есть некоторые данные, поступающие из базы данных, которые я хотел бы сгруппировать особым образом, используя 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-запроса, выводят что-то вроде этого (все фиктивные данные), просто чтобы дать представление о том, с чем мы имеем дело:
Когда я вызываю контроллер через интерфейсный вызов API, он почти делает то, что мне нужно.Он извлекает данные анкеты, сгруппированные по идентификатору анкеты, например так (обратите внимание, я расширил один из узлов «данных», чтобы продемонстрировать возвращаемые данные):
Пока все хорошо.
Однако теперь я хочу сгруппировать возвращаемые данные на основе 'youngPersonNodeId' так, чтобы для 'Adam Greenall' был только один объект, содержащий массив данных.из 25 предметов, один объект для 'Jamie Smith', содержащий 5 элементов данных, один объект для Zak, содержащий 15 элементов данных и т. д.
Я пробовал группировать по questionnaireId
и youngPersonNodeId
, но это неКажется, что ничего не изменилось:
var groups = questionnaires.GroupBy(x => new { x.questionnaireId, x.youngPersonNodeId });
Может ли кто-нибудь помочь с тем, как заставить работать эту последнюю группу?
Большое спасибо.