2014-08-29 69 views
0

我有以下EF實體:獲取兩個實體之一的列...使用last和groupby?

public class Evaluation { 
    public Int32 Id { get; set; } 
    public DateTime Created { get, set; } 
    public String Interview { get; set; } 
    public virtual ICollection<Test> Tests { get; set; } 
    public virtual ICollection<Exam> Exams { get; set; } 
} 

public class Student { 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
    public virtual Evaluation Evaluation { get; set; } 
} 

public class Exam { 
    public Int32 Id { get; set; } 
    public Int32 Note { get; set; } 
    public Int32? Factor { get; set; } 
    public virtual Evaluation Evaluation { get; set; } 
} 

public class Test { 
    public Int32 Id { get; set; } 
    public Int32 Note { get; set; } 
    public Int32? Factor { get; set; } 
    public virtual Evaluation Evaluation { get; set; } 
} 

幾個意見:

  1. 的評價可以有一個考試,一個測試或無。
  2. 考試或考試有一個筆記,但可以有或沒有因子。

我所尋找的是:

爲每個學生找到最後的考試或測試有兩個注意事項和因素。

然後得到的Notes /因素的列表和繁殖兩種:結果=注*因子

我嘗試以下操作:

context.Evaluations 
    .Where(x => x.Exam != null || x.Test != null) 
    .GroupBy(x => x.Student) 

在此之後,我不知道如何獲得最後的考試或者使用Note和Factor來測試並使用和計算結果。

我該怎麼做?

+0

只是一種愚蠢的想法的東西,也許你可以創建一個抽象類都繼承稱爲TestOrExam然後添加另一個連接的屬性? 它看起來像公共虛擬ICollection TestsOrExams {獲得{返回Tests.Cast ().Concat(考試); };} – 2014-08-29 18:50:13

+0

測試和考試在我的例子中非常相似,但在我的真實代碼中,他們不是......我只是爲了簡化問題而發佈這種方式。 – 2014-08-29 20:38:38

回答

0

你說,評估可以有1或0考試,但從代碼我明白它可以有很多(另外​​,其他東西不加起來,但它只是因爲這些是樣本類)。

public virtual ICollection<Exam> Exams { get; set; } 

如果您提供了更好的類樣本,我們可能會找到一種方法來使用1 LINQ查詢來獲得您想要的結果。
在任何情況下,您都可以在幾條語句中完成所需內容。

如果你的問題是如何考試相結合,並測試您可以使用類似於以下僞

public class UserQuiz { 
    public Int32 Id { get; set; } 
    public Int32 Note { get; set; } 
    public Int32? Factor { get; set; } 
    public Evaluation Evaluation { get; set; } 
} 

List<UserQuiz> examsAndTest=new List<UserQuiz>(); 
examsAndTest.AddRange(userExams.Select(e=>new UserQuiz(){ Id= e.Id /* copy the other properties here */}).ToList()); 
examsAndTest.AddRange(userTests.Select(e=>new UserQuiz(){ Id= e.Id /* copy the other properties here */}).ToList()); 

UserQuiz latestRecord= examsAndTest.OrderByDescending(e=>e.Evaluation.Created).FirstOrDefault(); 
相關問題