0

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

Pupil - SchoolClass - ClassType
     N:1           1:1

我想获取学生列表并更新他们的标量属性Grade。成绩取决于学生参加的班级类型。所以我还需要每个学生的 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 导航属性?

加载所需数量的学生,不包括是 20 毫秒,而包括是 250 毫秒。我想知道这是否可以优化?

4

1 回答 1

1

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

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

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

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

于 2011-10-20T12:26:58.227 回答