这两个LINQ-to-SQL查询可以合并吗?

问题描述 投票:1回答:1

我有两个表,ExamExamGroup具有*:*关系。给我一个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,这时我知道要创建它。

c# linq linq-to-sql entity-framework-core
1个回答
1
投票

是的,有可能。您只需要使用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选择此选项应该可以。

© www.soinside.com 2019 - 2024. All rights reserved.