我们首先使用EF 4.3代码并且具有如下对象模型:
class Content { }
class Product:Content { }
class News:Content { }
这些映射为每种类型的表。
在某些情况下,我只想加载属于基表的列,比如说所有内容标题的列表。但是像
这样的查询from c in Content
where c.IsDeleted == false
select c
导致一些非常讨厌的SQL与其他两个表的连接。有没有办法强制EF只从基表执行选择而不连接到其他表?
答案 0 :(得分:3)
TPT存在问题,EF生成的查询通常效率很低。此外,您的期望可能不正确。 Linq-to-entities总是返回实体的实体类型。如果记录实际上是Content
实体,则它不能返回Product
类型的实例。您的查询只有两个含义:
Content
,Product
和News
个实例的枚举。Content
实例 - 这必须再次执行连接才能正确地实例化仅映射到Content
的记录(与Product
和News
无关)。映射到Product
或News
的记录不会在枚举中返回。 Linq到实体无法进行此查询 - 您需要使用ESQL和OFTYPE ONLY
运算符。你可以尝试一些事情:
Content
- Product
和News
也是内容,因此如果从Linq-to返回Content
个实例,您将永远不会在没有连接的情况下进行查询实体查询