首页 > 解决方案 > 结果的 Lambda 或 LINQ

问题描述

我从用户那里得到了一个反馈表,反馈类包含步骤。

步骤可以实现 (A)、未实现 (DA) 或通过提示实现 (AWP)

Name    Step1             Step2         Step3         Step4                 
-----------------------------------------------------------------------
Zoinal  A                  AWP            A             DA  
Oomesh  A                  DA             DA            DA  
Marta   A                  DA             A             AWP 
MrBean  AWP                AWP            DA            A

但也想显示每个不同成就状态的数量。在表中是这样的:

Name    Step1               Step2         Step3           Step4  
summery:  A=3,AWP=1,DA=0  A=0,AWP=2,DA=2  A=2,AWP=0,DA=2  A=1,AWP=1,DA=2                
-----------------------------------------------------------------------
Zoinal  A                  AWP            A              DA 
Oomesh  A                  DA             DA            DA  
Marta   A                  DA             A             AWP 
MrBean  AWP                AWP            DA            A


public class FeedbackModel
{
    public int FeedBackID { get; set; }
    public List<FeedbackStepModel> FeedbackSteps { get; set; }
}

public class FeedbackStepModel
{
    [Key]
    public int FeedbackStepID { get; set; }
    public int FeedbackID { get; set; } = 0;   
    public int StepNumber { get; set; }
    public string StepDetail { get; set; }
    public string AchievementStatus { get; set; }
    public virtual FeedbackModel FeedBackModel { get; set; }
}

我试着做

var fullList = feedbackRepository.Feedbacks;

和两个“for each”循环

foreach (var item in fullList)
{
     foreach (var step in item.FeedbackSteps)
     {
         //               
     }
}

我确信使用 LINQ 有一种简单的方法可以做到这一点。任何人都可以帮忙,拜托。

标签: c#.netlinqasp.net-corelambda

解决方案


如果我理解它,您希望按步骤和状态进行分组计数,如果您希望将此作为子数组,您可以这样做

var groupCount = from feedback in feedbacks
                 from step in feedback.FeedbackSteps
                 group step by step.StepNumber into stepsByNumber
                 select new
                        {
                            StepNumber = stepsByNumber.Key,
                            CountsByStatus = from byStep in stepsByNumber
                                             group byStep by byStep.AchievementStatus into byAchievement
                                             select new { AchievementStatus = byAchievement.Key, Count = byAchievement.Count() }
                        };

如果你只是想要双重分组然后像这样

var groupCount = from feedback in feedbacks
                 from step in feedback.FeedbackSteps
                 group step by new { step.StepNumber, step.AchievementStatus } into stepsByNumber
                 select new { stepsByNumber.Key.StepNumber, stepsByNumber.Key.AchievementStatus, Count = stepsByNumber.Count() };

编辑:经过更多思考后,IQueryable您应该始终使用查询 2,然后在内存中执行子列表,因为第一个可能导致多个查询执行,或者只是一个不受支持的异常,这取决于查询提供程序。IEnumerable不确定女巫一个更好。


推荐阅读