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是否有充分理由这样做?有没有办法让它不这样做?
实体框架 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 文件并指定您想要的任何查询。