0

件名と親でグループ化された質問のリストがあります。

たとえば、私は

Subject 1
Parent 1
Question 1

Subject2
Parent2
Question2

Subject1
Parent2
Question3

Subject2
Parent2
Question4

今、ある種のツリービュー、つまり次のようなものを表示したいと思います

Subject 1
    Parent 1
       Question 1
    Parent 2
       Question 2
       Question 3

Subject 2
    Parent 1
       Question 4
    Parent 2
       Question 5
       Question 6

GroupBy LINQ ステートメントでそれを達成するにはどうすればよいですか?

まだ機能していないことを試しました

            var questionSubjectGrps = questionsBll.GetReportQuestions()
            .Where(x => x.VersionId == iLatestVersion)
            .OrderByDescending(x => x.SubjectId)
            .GroupBy(subject => new { subject.ReportQuestionTitle, subject.ParentId });

どんな助けでも大歓迎です

ありがとう

** * ** * ** * ** * ** * ** * ****新しいコード* ** * ** * ** * ** * ** *

            IEnumerable<ReportQuestion> questionSubjectGrps = questionsBll.GetReportQuestions().Where(x => x.VersionId == iLatestVersion);

        var tree = questionSubjectGrps.Select(questSubGrps => questSubGrps.SubjectId)
                  .Distinct()
                  .Select(q => new
                  {
                      Subject = q.SubjectId,
                      Parents = questionSubjectGrps
                                  .Where(q2 => q2.SubjectId == q.SubjectId)
                                  .Select(q2 => new
                                  {
                                      Parent = q2.ParentId,
                                      Question = questionSubjectGrps
                                          .Where(q3 => q3.SubjectId == q.SubjectId && q3.ParentId == q2.ParentId)
                                          .Select(q3 => q3.QuestionId)
                                  })

                  });
4

2 に答える 2

1

次のように、いくつかのレベルでこれを行うことができGroupByます。

この入力は、指定した入力ではなく、指定した予想される出力と一致します。

var questions = new List<Question>
    {
        new Question { SubjectId = 1, ParentId = 1, QuestionId = 1 },
        new Question { SubjectId = 1, ParentId = 2, QuestionId = 3 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 2 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 3 },
        new Question { SubjectId = 2, ParentId = 1, QuestionId = 4 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 5 },
        new Question { SubjectId = 2, ParentId = 2, QuestionId = 6 },
    };

最初のGroupByグループはサブジェクト ID によってグループ化されます。2 番目GroupByは、各サブジェクト グループを親 ID でグループ化します。

var grouped = questions.GroupBy(
    q => q.SubjectId,
    (sid, qs) => new { SubjectId = sid, Groups = qs.GroupBy(q => q.ParentId) });

2 つのレベルでは、すべての問題を取得するには 3 つのループGroupByが必要です。foreach

foreach (var subjectGroup in grouped)
{
    Console.WriteLine("Subject {0}", subjectGroup.SubjectId);
    foreach (var parentGroup in subjectGroup.Groups)
    {
        Console.WriteLine("\tParent {0}", parentGroup.Key);
        foreach (var question in parentGroup)
        {
            Console.WriteLine("\t\tQuestion {0}", question.QuestionId);
        }
    }
}
于 2013-05-28T09:28:12.133 に答える
0

GroupBy は実際にあなたが望むものではないと思います-階層構造が必要だと思います。例えば:

  var questionSubjectGrps = questionsBll
            .GetReportQuestions()
            .Tolist();

  var tree = questionSubjectGrps.Select(questionSubjectGrps => q.SubjectId)
            .Distinct()
            .Select(q => new 
            {
                Subject = q.SubjectId,
                Parents = questionSubjectGrps
                            .Where(q2 => q2.SubjectId == q.SubjectId)
                            .Select(q2 => new 
                            {
                                Parent = q2.ParentId,
                                Question = questionSubjectGrps
                                    .Where(q3 => q3.SubjectId == q.SubjectId && q3.ParentId == q2.ParentId)
                                    .Select(q3 => q3.QuestionId)
                            })

            });
于 2013-05-24T13:26:48.687 に答える