2012-09-20 98 views
4

我覺得自己像一個屁股踢腿比賽中的單腿男人......我需要添加一個屬性到我的LINQ數據集中,該數據集根據子集合的屬性提供摘要並然後壓扁我的數據。 (我正在創建一個.rdlc數據集)。我終於想出瞭如何將我的數據變平,但我無法弄清楚如何根據哪一組審閱者提供他們的評估來推導出價值。總結基於子集合的屬性

我有一些評估,我需要根據審稿小組總結一個結果審稿屬於:

  1. 如果任何一個評審組的評估是「大問題」,返回「大問題」。
  2. 如果所有評估都說「無問題」,則返回「無問題」。
  3. 如果沒有評估是「大問題」,並且至少有一個是空白,則返回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; } 
    } 
    
+0

樣本數據的預期輸出是什麼? – Aducci

+2

我編輯了你的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

+0

@Aducci - 我實際上正在嘗試創建一個預期的輸出結果,但在結束之前我看到了一個答案,因此我停下了腳步。謝謝! – Eclipse

回答

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; 
} 
+0

謝謝!我甚至沒有想過要調用一種方法。我認爲它必須是一個相對容易的解決方案。 – Eclipse

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(); 
    } 

的名稱變更將屬性評估爲AssessmentStr,因爲C#不允許屬性名稱與類名稱相同。

+0

感謝您的回覆。我敢肯定這個也會有效。我剛剛與杜加斯的回答一起去了,因爲我在這之前見過他。 – Eclipse