繁体   English   中英

实体框架为映射到视图的实体生成的SQL

[英]Entity Framework Generated SQL for Entity Mapped to a View

我已将EDM实体映射到数据库(SQL Server 2005)视图。 该实体是一个简单的电影实体,具有ID,Name和DateInserted属性,该属性对应于具有以下定义的View:

选择iMovieID,vchName,dtInsertDate
来自dbo.t_Movie WITH(NOLOCK)

表t_Movie具有以下定义:

创建表[dbo]。[t_Movie](
[iMovieID] [int] IDENTITY(1,1)NOT NULL,
[vchName] varchar NOT NULL,
[dtInsertDate] [datetime] NULL,
约束[PK_t_Movie]主键
([iMovieID] ASC
)(PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)开启[PRIMARY]
)在[PRIMARY]上

当我像这样向实体查询编写简单的Linq时:

 var q = from m in context.v_Movie where m.vchName.Contains("Ocean") select m;
            foreach (var movie in q)
            {
                Console.WriteLine("{0}:{1}",movie.iMovieID, movie.vchName);
            }

这是由探查器捕获的Entity框架生成的SQL:

选择
[Extent1]。[iMovieID] AS [iMovieID],
[Extent1]。[vchName] AS [vchName],
[Extent1]。[dtInsertDate] AS [dtInsertDate]
从(选择
[v_Movie]。[iMovieID]作为[iMovieID],
[v_Movie]。[vchName] AS [vchName],
[v_Movie]。[dtInsertDate] AS [dtInsertDate]
FROM [dbo]。[v_Movie] AS [v_Movie])AS [Extent1]
在哪里(CAST(CHARINDEX(N'Ocean',[Extent1]。[vchName])AS int))> 0

DBA担心内部选择:

选择
[v_Movie]。[iMovieID]作为[iMovieID],
[v_Movie]。[vchName] AS [vchName],
[v_Movie]。[dtInsertDate] AS [dtInsertDate]
FROM [dbo]。[v_Movie] AS [v_Movie])AS [Extent1]

随着表的增长,随着时间的流逝将导致一些严重的性能问题,因为它从视图中选择了所有行到临时表([Extent1]),然后外部SELECT从该临时表中进行选择。

EF需要执行此操作的任何特殊原因,是为什么不能生成以下SQL的任何原因:

选择
[v_Movie]。[iMovieID]作为[iMovieID],
[v_Movie]。[vchName] AS [vchName],
[v_Movie]。[dtInsertDate] AS [dtInsertDate]
来自[dbo]。[v_Movie] AS [v_Movie]
在哪里(CAST(CHARINDEX(N'Ocean',[Extent1]。[vchName])AS int))> 0

我使用以下SQL向表中填充了100,000条记录,但是执行LINQ查询时没有发现性能下降。 Profiler显示查询运行了不到一秒钟:

开始
声明@counter int
设置@counter = 0
而@counter <100000
开始
设置@counter = @counter + 1

插入t_Movie(vchName)值('Movie'+ CONVERT(varchar,@ counter))
结束
结束

这是一个有效的问题吗?

PS-

(CAST(CHARINDEX(N'Ocean',[Extent1]。[vchName])AS int))在这里不是问题,因为我使用的LINQ to Entities查询仅用于说明。

任何见解将不胜感激

使用XML编辑器查看您的.EDMX文件。 您将在电影视图中找到一些内容,并在其中找到该视图的选择语句。 删除select语句,并使其余视图XML看起来更像您的表。 之所以得到这个内部选择,是因为EF天真地尝试将列映射到视图中的不同名称而不是默认名称。

我从MSDN论坛上得到了这个答案,这很有意义:

实体框架生成的SQL

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM