7

我们首先使用 EF 4.3 代码,并有一个像这样的对象模型:

class Content {  }

class Product:Content { }

class News:Content { }

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

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

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

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

4

1 回答 1

3

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

  • 返回所有未删除的内容 - 这必须执行连接以正确实例化真实类型的实体。查询将返回和实例Content的枚举。ProductNews
  • 返回所有未删除Content的实例 - 这可能必须再次执行连接以正确实例化仅Content直接映射到的记录(与Productand无关News)。没有映射到ProductNews将在枚举中返回的记录。Linq-to-entities 无法进行此查询 - 您需要使用 ESQL 和OFTYPE ONLY运算符。

您可以尝试以下几件事:

  • 升级到 .NET 4.5 - TPT 查询有一些改进
  • 返回属性的投影而不是Content-Product并且News也是内容,因此如果您Content从 Linq-to-entities 查询返回实例,您将永远不会在没有连接的情况下获得查询
于 2012-07-17T09:22:05.240 回答