4

お尻を蹴るコンテストで片足の男のように感じます...サブコレクションのプロパティに基づいて要約を提供するプロパティをLINQデータセットに追加してから、データをフラット化する必要があります。(.rdlcデータセットを作成しています。)最終的にデータをフラット化する方法を理解しましたが、どのレビューアグループが評価を提供したかに基づいて値を導出する方法を理解できません。

いくつかの評価があり、レビュー担当者が属するレビュー担当者グループに基づいて1つの結果を要約する必要があります。

  1. レビューグループの評価のいずれかが「大きな問題」である場合は、「大きな問題」を返します。

  2. すべての評価で「問題なし」と表示された場合は、「問題なし」を返します。

  3. 「大きな問題」である評価がなく、少なくとも1つが空白の場合は、nullを返します。

    以下は、私が話していることをうまく示すために作成したサンプルセットです。

    public List<SummaryReport> CreateReport()
    {
         return Get()
             .SelectMany(rev => rev.Assessments, (rev, ass) => new { rev, ass })
             .Select(x => new SummaryReport
             {
                 ReviewID = x.rev.ReviewID,
                 ReviewerID = x.ass.Reviewer.ReviewerID,
                 Assessment = x.ass.Assessment,
                 ReviewGroupID = x.ass.Reviewer.ReviewGroup.ReviewGroupID,
                 GroupAssessment = "Need to derive this value!!??!?"
              })
             .ToList();
     }
    
    public List<Review> Get()
    {
        ReviewGroup GrpOne = new ReviewGroup(){ ReviewGroupID=1};
        ReviewGroup GrpTwo = new ReviewGroup(){ ReviewGroupID=2};
        ReviewGroup GrpThree = new ReviewGroup(){ ReviewGroupID=3};
    
        ReviewerInfo userOne = new ReviewerInfo() { ReviewerID=1, ReviewGroup = GrpOne};
        ReviewerInfo userTwo = new ReviewerInfo() { ReviewerID=2, ReviewGroup = GrpTwo};
        ReviewerInfo userThree = new ReviewerInfo() { ReviewerID=3, ReviewGroup = GrpTwo};
        ReviewerInfo userFour = new ReviewerInfo() { ReviewerID=4, ReviewGroup = GrpThree};
    
        Assessment asOne = new Assessment() { AssessmentID=1, Reviewer=userOne, Assessment="Big Problem"};
        Assessment asTwo = new Assessment() { AssessmentID=2, Reviewer=userTwo, Assessment="No Problem"};
        Assessment asThree = new Assessment() { AssessmentID=3, Reviewer=userThree, Assessment="No Problem"};
        Assessment asFour = new Assessment() { AssessmentID=4, Reviewer=userFour, Assessment=""};
    
        Assessment asFive = new Assessment() { AssessmentID=5, Reviewer=userOne, Assessment="No Problem"};
        Assessment asSix = new Assessment() { AssessmentID=6, Reviewer=userTwo, Assessment="No Problem"};
        Assessment asSeven = new Assessment() { AssessmentID=7, Reviewer=userThree, Assessment="No Problem"};
        Assessment asEight = new Assessment() { AssessmentID=8, Reviewer=userFour, Assessment="No Problem"};
    
        Assessment asNine = new Assessment() { AssessmentID=9, Reviewer=userOne, Assessment="No Problem"};
        Assessment asTen = new Assessment() { AssessmentID=10, Reviewer=userTwo, Assessment=""};
        Assessment asEleven = new Assessment() { AssessmentID=11, Reviewer=userThree, Assessment="No Problem"};
        Assessment asTwelve = new Assessment() { AssessmentID=12, Reviewer=userFour, Assessment="No Problem"};
    
        List<Assessment> firstList = new List<Assessment>() { asOne, asTwo, asThree, asFour };
        List<Assessment> secondList = new List<Assessment>() {asFive, asSix, asSeven, asEight};
        List<Assessment> thirdList = new List<Assessment>() { asNine, asTen, asEleven, asTwelve };
    
        Review revOne = new Review() { ReviewID=1, Assessments=firstList };
        Review revTwo = new Review() { ReviewID=2, Assessments = secondList };
        Review revThree = new Review() { ReviewID = 3, Assessments = thirdList };
    
        List<Review> reviews = new List<Review>() { revOne, revTwo, revThree };
    
        return reviews;
    }
    
    public class SummaryReport
    {
        public int ReviewID { get; set; }
        public int ReviewerID { get; set; }
        public string Assessment { get; set; }
        public int ReviewGroupID { get; set; }
        public string GroupAssessment { get; set; }
     }
    
    public class Review
    {
         public int ReviewID { get; set; }
         public virtual List<Assessment> Assessments { get; set; }
         public Review() { }
    }
    
    public class Assessment
    {
         public int AssessmentID { get; set; }
         public ReviewerInfo Reviewer { get; set; }
         public string Assessment { get; set; }
    }
    
    public class ReviewerInfo
    {
         public int ReviewerID { get; set; }
         public ReviewGroup ReviewGroup { get; set; }
    }
    
    public class ReviewGroup
    {
         public int ReviewGroupID { get; set; }
    }
    
4

2 に答える 2

1

メソッドを定義し、プロジェクション中に呼び出すことができます。

注:Assessment.AssessmentプロパティをAssessment.AssessmentDescriptionに変更して、プロパティ名が囲んでいるタイプと同じにならないようにしました

public List<SummaryReport> CreateReport()
{
 return Get()
     .SelectMany(rev => rev.Assessments, (rev, ass) => new { rev, ass })
     .Select(x => new SummaryReport
     {
         ReviewID = x.rev.ReviewID,
         ReviewerID = x.ass.Reviewer.ReviewerID,
         Assessment = x.ass.Assessment,
         ReviewGroupID = x.ass.Reviewer.ReviewGroup.ReviewGroupID,
         GroupAssessment = DeriveGroupAssessment(x.rev.Assessments)
      })
     .ToList();
 }


private static string DeriveGroupAssessment(IEnumerable<Assessment> assessments)
{
  string assessment = null;

  if (assessments.Any(a => a.AssessmentDescription == "Big Problem"))
  {
    assessment = "Big Problem";
  }
  else if (assessments.All(a => a.AssessmentDescription == "No Problem"))
  {
    assessment = "No Problem";
  }

  // If you want the value to be null if neither of the above conditions are met, this logic is not needed
  ////if (!assessments.Any(a => a.AssessmentDescription == "Big Problem")
  ////    && assessments.Any(a => a.AssessmentDescription == string.Empty))
  ////{
  ////  assessment = null;
  ////}

  return assessment;
}
于 2012-09-20T18:08:30.300 に答える
1

試す、

 public static List<SummaryReport> CreateReport()
    {
        return Get()
            .SelectMany(rev => rev.Assessments, (rev, ass) => new { rev, ass })
            .Select(x => new SummaryReport
            {
                ReviewID = x.rev.ReviewID,
                ReviewerID = x.ass.Reviewer.ReviewerID,
                Assessment = x.ass.AssessmentStr,
                ReviewGroupID = x.ass.Reviewer.ReviewGroup.ReviewGroupID,
                GroupAssessment = x.rev.Assessments.Any(a => a.AssessmentStr == "Big Problem") ? "Big Problem" : 
                x.rev.Assessments.All(a => a.AssessmentStr == "No Problem")? "No Problem" : null
            })
            .ToList();
    }

C#ではクラス名と同じプロパティ名が許可されていないため、Assessmentプロパティの名前をAssessmentStrに変更しました。

于 2012-09-20T18:16:46.877 に答える