2012-07-17 75 views
5

我们首先使用EF 4.3代码选择并有一个对象模型像这样:实体框架表 - 仅由基型柱

class Content { } 

class Product:Content { } 

class News:Content { } 

这些被映射为每个类型表。

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

from c in Content 
where c.IsDeleted == false 
select c 

结果与一些真正讨厌的SQL查询连接到其他两个表。有没有什么办法强制EF只从基表中进行选择而不加入其他表?

回答

3

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

  • 返回所有未删除的内容 - 这必须执行连接才能正确实例化实际类型的实体。查询将返回枚举ContentProductNews实例。 (这与ProductNews没有关系)。没有记录映射到ProductNews将在枚举中返回。这个查询不可能用于Linq-to-entities - 您需要使用ESQL和OFTYPE ONLY运算符。

有一些事情你可以尝试:

  • 升级到.NET 4.5 - 有一些改进的TPT查询
  • 性质的回归突而非Content - ProductNews也是内容所以如果你返回Content实例从Linq到实体查询
+0

感谢你的一堆为你响应。对于我们正在开发的当前正在进行的项目而言,升级到4.5是不可能的,而这个项目本应在下个月开始实施。我们正计划用存储过程来做这样的查询。 – madaboutcode 2012-07-17 14:35:04