【问题标题】:Need to query related data with ONE query需要用ONE查询查询相关数据
【发布时间】:2016-01-05 21:41:38
【问题描述】:

这是我的简单 ERD

对于给定的 schoolyearId,我想加载所有学校课程 + 相关学生 + 相关科目。

  var schoolclasses = context.Schoolclasses
                .Include(s => s.Pupils)
                // How to get here the SubjectPupil + Subject for each pupil?
                .Where(s => s.SchoolyearId == schoolyearId);

这个 ERD 中唯一特别的是与瞳孔和主题的多对多关系。

在 EF7 中,我像 SubjectPupil 一样为它创建了一个桥接表。

您将如何扩展我上面的查询或正确执行以获取上述查询中每个学生的主题数据?

【问题讨论】:

  • 再次... 为什么要结束这个问题?有什么意见吗?

标签: c# entity-framework-core


【解决方案1】:

对于所有不赞成投票的人和不加评论的白痴。

从这个 SO 答案中,我发现 Intellisense 没有正确显示 .ThenInclude() 。因此我认为查询不起作用:

EF7 nested Include not showing in Razor .net

获取我想要的数据的解决方案是这样的。

  var schoolclasses = await context.Schoolclasses
                .Include(x => x.Pupils)
                .ThenInclude(x => x.PupilsSubjects)
                .ThenInclude(x => x.Subject)
                .Where(s => s.SchoolyearId == schoolyearId)
                .ToListAsync();

只需将您的属性名称输入到 ThenInclude 并构建项目,它就会编译!

【讨论】:

    【解决方案2】:

    如果没有看到类代码很难说,但如果本质上您的问题是您如何从多个级别急切加载相关实体,您可以执行以下操作:

    var schoolclasses = context.Schoolclasses
        .Include(s => s.Pupils.Select(pupil => pupil.SubjectPupil.Subject))
        .Where(s => s.SchoolyearId == schoolyearId);
    

    Here's the MSDN article 描述了这种行为。

    【讨论】:

    • 类代码是我在图中告诉的设置。只有一种方法可以在 EF7 中设置 1:N 或 N:M 关系。 github.com/aspnet/EntityFramework/wiki/… 您的 .Select 是它在 EF6 中使用的方式,但带有 ThenInclude 的 EF7 应该替换它,但这在我的情况下不起作用。你能用 ThenInclude 试试吗,也许我做错了什么?
    • 这样编译:.Include(s => s.Pupils.Select(pupil => student.PupilsSubjects.Select(c => c.Subject))) 但我得到一个运行时异常: SubQueryExpression 无法转换为 System.Linq.Expressions.MemberExpression
    • 当我在第一个 Include intellisense 之后附加一个 ThenInclude(x => x.PupilsSubjects) 时,我会得到一个 linq 方法列表,但不是我的具体类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-30
    • 2021-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    相关资源
    最近更新 更多