当我对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有充分理由这样做吗?有没有办法让它不这样做?
答案 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