c# - Entity Framework 在 View 中选择了太多列

标签 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 View 进行类似的查询,Entity Framework 会生成引用 View 中每一列的 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 block 被发送到服务器。 (我的实际示例包括一个连接,它导致几个表中的每一列都被选中...)

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

最佳答案

Entity Framework edmx 生成器使用DefiningQuery 元素定义基于 View 的实体集,并显式指定 View 的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 的元素

关于c# - Entity Framework 在 View 中选择了太多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20633797/

相关文章:

c# - 如何在 Entity Framework 5 代码中映射标识关系第一个子实体与多个互斥父实体

c# - 代码先创建表

c# - 枚举 EF 5.0 - 数据库优先

c# - 如何使用 EF5 和存储库检查给定 ID 的记录是否已存在

c# - Resharper 中令人困惑的代码突出显示

c# - 排序 PointF 数组

c# - Microsoft Graph API - 权限不足,Request_ResourceNotFound - Azure 权限问题

c# - 动态字段 const 与任何旧的引用字段 const 行为

C# SQL 命令参数不起作用

entity-framework - 删除具有一对多关系的 child 的 parent