获取两个实体之一的列..使用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; }
}
一些观察:
- 一个评估可以有一个检查、一个测试或没有
- Exam或Test有一个注释,但可以有也可以没有Factor
我要找的是:
对于每个学生,找到最后一个同时具有注释和因子的考试或测试。
然后得到这个注释/因子列表,并将两者相乘:结果=注释*因子
我正在尝试以下内容:
context.Evaluations
.Where(x => x.Exam != null || x.Test != null)
.GroupBy(x => x.Student)
在这之后,我不知道如何获得最后一次既有注释又有系数的考试或测试,并计算结果。
我该怎么做?
您说过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();