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

本文关键字:使用 last groupby 实体 两个 获取 | 更新日期: 2023-09-27 18:19:58

我有以下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. Exam或Test有一个注释,但可以有也可以没有Factor

我要找的是:

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

然后得到这个注释/因子列表,并将两者相乘:结果=注释*因子

我正在尝试以下内容:

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

在这之后,我不知道如何获得最后一次既有注释又有系数的考试或测试,并计算结果。

我该怎么做?

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

您说过Evaluation可以有1或0个Exams,但从代码a中我了解到它可以有很多(此外,其他东西加起来不算,但这只是因为这些是示例类)。

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