Лямбда или LINQ для результата - PullRequest
0 голосов
/ 24 марта 2019

Я получил от пользователя таблицу обратной связи, а класс обратной связи содержит шаги ... Шаги могут быть выполнены (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 AchivmentStatus { get; set; }
    public virtual FeedbackModel FeedBackModel { get; set; }

}

Я пытался сделать

var fullList = feedbackRepository.Feedbacks;

и две "для каждого" петли

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

           }
}

Я уверен, что есть простой способ сделать это с помощью LINQ. Может кто-нибудь помочь, пожалуйста.

1 Ответ

2 голосов
/ 24 марта 2019

Если я понял, вам нужно количество групп по шагам и статусу, если вы хотите это как подмассив, вы можете сделать это так:

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.AchivmentStatus into byAchivment
                                                  select new { AchivmentStatus = byAchivment.Key, Count = byAchivment.Count() }
                             };

Если вы просто хотели двойную группировку, то вот так

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

Редактировать: После некоторого размышления о IQueriable вы всегда должны использовать запрос 2, а затем создавать подсписки в памяти, поскольку первый может привести к многократному выполнению запроса или просто к неподдерживаемому исключению, это зависит от поставщика запросов.С IEnumerable не совсем уверен, что ведьма лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...