实体框架在视图中选择了太多列

时间:2013-12-17 12:12:18

标签: c# entity-framework-5

当我对SQL表使用Entity Framework时,它只引用生成的SQL中的必要列:

ctx.Types.Select(rdi => rdi.Name)

变为

SELECT [Extent1].[Name] AS [Name]
FROM [dbo].[Types] AS [Extent1]

但是,如果我对SQL视图进行类似的查询,Entity Framework会在视图中生成引用每列的SQL:

ViewTypes.Select(rdi => rdi.Name)

变为

SELECT [Extent1].[Name] AS [Name]
FROM (SELECT 
      [ViewTypes].[Name] AS [Name], 
      ... every other column in my view ...
      FROM [dbo].[ViewReferenceDataTypes] AS [ViewReferenceDataTypes]) AS [Extent1]

我确信SQL Server会执行自己的优化,最终忽略它不关心的所有列,但这仍然会导致大量的SQL发送到服务器。 (我的实际示例包括一个连接,这导致几个表中的每一列都被选中...)

Entity Framework有充分理由这样做吗?有没有办法让它这样做?

1 个答案:

答案 0 :(得分:1)

Entity Framework edmx生成器使用DefiningQuery元素基于视图定义实体集,并显式指定视图的SQL查询:

<EntitySet Name="custview" EntityType="AdventureWorksLTModel.Store.custview">
  <DefiningQuery>SELECT [custview].[CustomerID] AS [CustomerID], 
   [custview].[FirstName] AS [FirstName], 
   [custview].[LastName] AS [LastName], 
   [custview].[CompanyName] AS [CompanyName]
   FROM [dbo].[custview] AS [custview]
  </DefiningQuery>
</EntitySet>

所以,EF可以将过滤表达式应用于DefiningQuery的唯一方法是用子查询包装它。如果您认为数据库效率不高,可以在任何文本编辑器中手动编辑edmx文件,并指定所需的任何查询。

还有QueryView元素,可能是more effective