每种类型的实体框架表 - 仅从基本类型列中进行选择

时间:2012-07-17 01:58:34

标签: entity-framework table-per-type

我们首先使用EF 4.3代码并且具有如下对象模型:

class Content {  }

class Product:Content { }

class News:Content { }

这些映射为每种类型的表。

在某些情况下,我只想加载属于基表的列,比如说所有内容标题的列表。但是像

这样的查询
from c in Content
where c.IsDeleted == false
select c

导致一些非常讨厌的SQL与其他两个表的连接。有没有办法强制EF只从基表执行选择而不连接到其他表?

1 个答案:

答案 0 :(得分:3)

TPT存在问题,EF生成的查询通常效率很低。此外,您的期望可能不正确。 Linq-to-entities总是返回实体的实体类型。如果记录实际上是Content实体,则它不能返回Product类型的实例。您的查询只有两个含义:

  • 返回所有未删除的内容 - 这必须执行连接才能正确实例化实际类型的实体。该查询将返回ContentProductNews个实例的枚举。
  • 返回所有未删除的Content实例 - 这必须再次执行连接才能正确地实例化仅映射到Content的记录(与ProductNews无关)。映射到ProductNews的记录不会在枚举中返回。 Linq到实体无法进行此查询 - 您需要使用ESQL和OFTYPE ONLY运算符。

你可以尝试一些事情:

  • 升级到.NET 4.5 - TPT查询有一些改进
  • 属性的返回投影而不是Content - ProductNews也是内容,因此如果从Linq-to返回Content个实例,您将永远不会在没有连接的情况下进行查询实体查询