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

Raw*_*ing 5 c# entity-framework-5

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

ctx.Types.Select(rdi => rdi.Name)
Run Code Online (Sandbox Code Playgroud)

SELECT [Extent1].[Name] AS [Name]
FROM [dbo].[Types] AS [Extent1]
Run Code Online (Sandbox Code Playgroud)

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

ViewTypes.Select(rdi => rdi.Name)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Lif*_*ess 1

实体框架 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>
Run Code Online (Sandbox Code Playgroud)

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

还有QueryView元素可能更有效