我有一些来自数据库的数据,我想使用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; }
}
然后我有一个Web API控制器,从数据库中提取数据并将数据映射到视图模型(使用PetaPoco'micro'ORM),如下所示:
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调用调用控制器时,它几乎可以满足我的需要。它拉回按调查表ID分组的调查表数据,如下所示(请注意,我已经扩展了“数据”节点之一以演示返回的数据):
到目前为止很好。
但是,我现在想基于“ youngPersonNodeId”对返回的数据进行分组,以便“ Adam Greenall”只有一个对象,其中包含25个项目的数据数组,“ Jamie Smith”的一个对象中,包含5个数据项,一个包含15个数据项的Zak对象,等等。
我尝试对questionnaireId
和youngPersonNodeId
进行分组,但这似乎没有什么不同:
var groups = questionnaires.GroupBy(x => new { x.questionnaireId, x.youngPersonNodeId });
有人可以帮助如何使最终分组生效吗?
非常感谢。
答案 0 :(得分:2)
您只需要按youngPersonNodeId
分组,而不要按questionnaireId
var groups = questionnaires.GroupBy(x => new { x.youngPersonNodeId });
OR
var groups = questionnaires.GroupBy(x => x.youngPersonNodeId);