获取两个实体之一的列...使用last和groupby?

时间:2014-08-29 18:31:42

标签: c# entity-framework

我有以下EF实体:

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. 考试或考试有一个注释,但可以有或没有因素。
  3. 我在寻找的是:

    对于每个学生,找到具有注释和因子的最后一个考试或考试。

    然后获取这个Notes / Factors列表并将两者相乘:Result = Note * Factor

    我正在尝试以下方法:

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

    在此之后,我不知道如何使用Note和Factor来进行最后一次考试或考试,并计算结果。

    我该怎么做?

1 个答案:

答案 0 :(得分: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();