【问题标题】:Querying a junction table using EF Core使用 EF Core 查询联结表
【发布时间】:2020-08-08 09:34:09
【问题描述】:

我有几个表,我试图从尽可能少的查询中提取信息。我有一个主表timelineinfo,两个连接表junc_timelineinfo_officerjunc_timelineinfo_subject,还有另外两个表officersubject。除了主键 Id 的名称外,officer 和 subject 是相同的。我的目标是:

  1. 给定一个日期,从日期匹配的timelineinfo 获取一个ID
  2. 在联结表中使用该 ID 来查找匹配的 IdSubjectIdOfficer
  3. 使用IdSubjects 和IdOfficers 获取具有这些ID 的行。

我已经使用以下代码完成了第一步:

var Events = await _context.Timelineinfo.Where(t => t.Date.Equals(date)).ToListAsync();

我认为我已经完成了第二步和第三步:

var SubjectIds = await _context.Junc_Timelineinfo_Subject
                    .Where(id => id.IdTimelineinfo.Equals(Event.IdTimelineInfo))
                    .Select(i => i.IdSubject)
                    .ToListAsync();
var OfficerIds = await _context.Junc_Timelineinfo_Officer
                     .Where(id => id.IdTimelineinfo.Equals(Event.IdTimelineInfo))
                     .Select(i => i.IdOfficer)
                     .ToListAsync();

//Step three
var Subjects = await _context.Subjects
                    .Where(i => i.IdSubject.Equals(SubjectIds))
                    .ToListAsync();
var Officers = await _context.Officers
                    .Where(i => i.IdOfficer.Equals(OfficerIds))
                    .ToListAsync();              

但这很快就会变得笨拙并使用一堆查询。如何将其简化为尽可能少的查询?

【问题讨论】:

    标签: c# mysql entity-framework linq


    【解决方案1】:

    您是否尝试过将 Eager Loading 用于 EF。 您需要先在您的 dbcontext 或在您的模型中使用 Data annotations 定义模型之间的关系/外键

    然后你可以这样调用结果:

    var Events = await _context.Timelineinfo.Include(x => x.Subjects).Include(x => x.Officers).Where(t => t.Date.Equals(date)).ToListAsync();
    

    【讨论】:

    • 对不起,回复晚了,我对EF核心中包含的使用做了一些研究,据我了解,他们首先从其他表中查询所有数据,然后根据位置限制删除内容。这要慢得多,并且可以通过更复杂的搜索快速建立。
    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多