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

mad*_*ode 6 entity-framework table-per-type

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

class Content {  }

class Product:Content { }

class News:Content { }
Run Code Online (Sandbox Code Playgroud)

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

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

from c in Content
where c.IsDeleted == false
select c
Run Code Online (Sandbox Code Playgroud)

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

Lad*_*nka 3

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

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

您可以尝试以下几件事:

  • 升级到 .NET 4.5 - TPT 查询有一些改进
  • 返回属性的投影而不是Content-Product并且也是内容,因此如果您从 Linq-to-entities 查询News返回实例,您将永远不会得到没有连接的查询Content