【问题标题】:Entity Framework - Skipping objects in navigation path实体框架 - 在导航路径中跳过对象
【发布时间】:2011-10-20 12:13:02
【问题描述】:

我有基于 3 个数据库表的三个实体(关系下方的基数)。

Pupil - SchoolClass - ClassType
     N:1           1:1

我想获取学生列表并更新他们的标量属性Grade。 成绩取决于学生参加的班级类型。所以我还需要每个 Pupil 的 ClassType。

这就是我的工作:

var pupils = from pupil in db.Pupils.Include("SchoolClass.ClassType")
             select pupil;

foreach(Pupil p in pupils)
    p.Grade *= p.SchoolClass.ClassType.GradingFactor;

这样做的问题是 SchoolClass 被加载到上下文中,所有标量属性都填充了(+外键 ID)。

有没有办法跳过 Pupil 和 ClassType 实体之间的对象?也就是说,只加载 SchoolClass 的 ClassType 导航属性?

在没有 Include 的情况下加载所需的学生数量是 20 毫秒,在 Include 情况下是 250 毫秒。我想知道这是否可以优化?

【问题讨论】:

    标签: c# entity-framework navigation-properties


    【解决方案1】:

    如果我的查询正确,则在没有包含的情况下加载所需数量的 puples 只是在 1 个表上进行选择,无需分段或排序。那当然更快。

    现在您加载所有导航属性。那是一些工作。您是否想过只选择瞳孔及其 GradingFactor?

    var pupils = from pupil in db.Pupils 
                 select new
                 {
                    Pupil = pupil,
                    GradingFactor = pupil.SchoolClass.ClassType.GradingFactor
                 }; 
    

    另一个优化是将 SchoolClass 和 ClassType 合并在一起,因为它们的关系是 1:1(根据您的规范),从而为您节省 1 个加入

    【讨论】:

    • 您是说学生.SchoolClass.ClassType.GradingFactor 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    相关资源
    最近更新 更多