【发布时间】:2018-10-15 11:21:10
【问题描述】:
我有一个继承策略 Table per Type (TPT),其中包含一个抽象类“Task”,其中包含许多具体类(如 30 个类)。 当我尝试显示“待办任务”的工作列表时,向 EF 询问抽象类,或者当我尝试通过 ID 获取通用任务时,EF 会进行 10000 行查询加入每个具体类,结果非常慢。 有没有办法配置 EF 来避免大查询? 在worklist方法中,我只需要抽象类的字段。
这是我的代码:
public Task GetTaskById(int id) {
return this.repository.Tasks.Where(t => t.ID == id).FirstOrDefault();
}
public IQueryable<Task> GetWorklist() {
return this.repository.Tasks.Where(t => a.ActivitySate.Code == ActivitySateEnum.TO_DO);
}
谢谢
【问题讨论】:
-
你明白抽象类没有表。因此,数据分布在非抽象类的所有表中。我建议您重新考虑您的设计,将公共数据放入所有其他类也具有外键的类中。事实上,这种关系可以在所有其他类继承自的抽象类中建模。
-
就像你说的,我忘了解释我使用了 Table per Type (TPT) 继承
-
您的查询可能会返回所有具体类表的结果,因此可以预期多个连接。如果您试图仅从一种具体类型中提取结果(这在您的问题中并不清楚),那么您可以将鉴别器作为查询的一部分,或者仅针对这种类型将不同的 DbSet 添加到您的上下文中。如果您在问题中包含所有相关代码(即您的 DbContext 和类结构)可能会有所帮助。
-
您需要实际显示您的代码...我的意思是,Tasks 是什么以及存储库的东西。
-
“我使用了每个类型的表 (TPT) 继承”考虑切换到每个层次结构的表 (TPH)。
标签: c# performance entity-framework inheritance