我有两个表,Exam
和ExamGroup
具有*:*关系。给我一个List<Exam>
,需要确定此列表的ExamGroup
是否已经存在。因此提供的列表可能是A + B + C,ExamGroups
将包含A + B,A + C,A + B + C + D + E等,因此我需要确定A + B + C是否存在并创建它(如果没有)。下面的代码似乎可以执行此操作,但是我想知道是否可以在单个表达式中执行此操作吗?
var givenExams = /* Provided list of exams */
var examGroup = _context
.ExamGroups
.Include(x => x.ExamGroupsExam) // Mapping table for EF Core
.ThenInclude(y => y.Exam)
.AsEnumerable();
examGroup = givenExams.Aggregate(
examGroup,
(current, exam) => current.Where(x => x.Exams.Contains(exam)));
[此时examGroup
是相关的组(具有ID和我关心的其他字段)或null,这时我知道要创建它。
是的,有可能。您只需要使用ExamGroupsExam
表即可确定它。请在子查询中通过ExamGroupsExam
(使用ExamId
列表)过滤givenExams
表,然后按ExamId
分组ExamGroupId
。从这一点来看,查询可以识别该组中的考试数量。如果此数字与givenExams
中的项目数匹配,则该组存在(如果不能创建)。 :)
我确实从头开始创建了一个查询,希望它将帮助您继续前进:
var isExamGroupExists = (from examGroupsExam in _context.ExamGroupsExam
where (from examGroupsExam in _context.ExamGroupsExam
where givenExams.Any(x => x.Id == examGroupsExam.ExamId)
select examGroupsExam.ExamGroupId).Any(x == examGroupsExam.ExamGroupId)
group examGroupsExam.ExamId by examGroupsExam.ExamGroupId
into examGroup
select new {
NumberOfExamsInGroup = examGroup.Count(),
ExamGroupId = examGroup.Key
}).Any(x => x.NumberOfExamsInGroup == givenExams.Count);
if (isExamGroupExists == false)
{
// then create it
}
编辑:我注意到第一个查询中存在一个错误,因此我在上面进行了更改并添加了一个子查询。基本上,该错误是:如果A + B + C + D考试是一组,则如果您正在寻找A + B + C组,则返回true,使用sub选择此选项应该可以。