使用LINQ在2个字段上对数据组进行分组

时间:2018-10-19 09:56:50

标签: c# linq lambda group-by

我有一些来自数据库的数据,我想使用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查询返回的数据输出类似这样的内容(所有虚拟数据),只是为了让我们了解我们要处理的内容:

enter image description here

当我通过前端API调用调用控制器时,它几乎可以满足我的需要。它拉回按调查表ID分组的调查表数据,如下所示(请注意,我已经扩展了“数据”节点之一以演示返回的数据):

enter image description here

到目前为止很好。

但是,我现在想基于“ youngPersonNodeId”对返回的数据进行分组,以便“ Adam Greenall”只有一个对象,其中包含25个项目的数据数组,“ Jamie Smith”的一个对象中,包含5个数据项,一个包含15个数据项的Zak对象,等等。

我尝试对questionnaireIdyoungPersonNodeId进行分组,但这似乎没有什么不同:

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

有人可以帮助如何使最终分组生效吗?

非常感谢。

1 个答案:

答案 0 :(得分:2)

您只需要按youngPersonNodeId分组,而不要按questionnaireId

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

OR

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