【问题标题】:Can these two LINQ-to-SQL queries be combined?这两个 LINQ-to-SQL 查询可以组合吗?
【发布时间】:2020-05-11 21:28:14
【问题描述】:

我有两个表,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】:

    是的,这是可能的。您只需要使用ExamGroupsExam 表来确定它。请在子查询中通过ExamId(使用givenExams 列表)过滤ExamGroupsExam 表,然后通过ExamGroupIdExamId 进行分组。从这一点开始,查询可以识别该组中的检查数量。如果此数字与 givenExams 中的项目数匹配,则该组存在,否则您可以创建它。 :)

    我确实从头顶创建了一个查询,希望它可以帮助您继续前进:

    var examGroupExists = (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 (examGroupExists == false) 
    {
        // then create it
    }
    

    编辑:我注意到第一个查询中有一个错误,所以我在上面进行了更改并添加了一个子查询。基本上错误是:如果 A + B + C + D 考试是一组,那么如果您正在寻找 A + B + C 组,则返回 true,使用子选择这应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-10
      • 2010-09-21
      • 2021-06-02
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多