我已经将EDM实体映射到数据库(SQL Server 2005)视图。 该实体是一个简单的电影实体,其具有的ID,姓名和DateInserted其对应于其中具有以下定义一个视图属性:实体框架为映射到视图的实体生成的SQL
SELECT iMovieID,vchName,dtInsertDate
FROM dbo.t_Movie WITH(NOLOCK)
表t_Movie具有以下定义:
CREATE TABLE [DBO] [t_Movie](
[iMovieID] [INT] IDENTITY(1,1)NOT NULL,
[vchName] VARCHAR NOT NULL,
[dtInsertDate] [日期时间] NULL,
约束[PK_t_Movie] PRIMARY KEY CLUSTERED
( [iMovieID] ASC
)WITH( PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON)ON [PRIMARY]
)ON [PRIMARY]
GO
当我编写一个简单的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);
}
这里是通过由分析器捕获的实体框架生成的SQL:
SELECT
[Extent1] [iMovieID] AS [iMovieID],
[Extent1] [vchName] AS [vchName],
[Extent1] [dtInsertDate] AS [dtInsertDate]
FROM(SELECT
[v_Movie] [iMovieID] AS [iMovieID],
[v_Movie]。[VCH名] AS [vchName],
[v_Movie] [dtInsertDate] AS [dtInsertDate]
FROM [DBO]。[v_Movie] AS [v_Movie])AS [Extent1]
WHERE(CAST(CHARINDEX(N'Ocean ”,[Extent1] AS INT [vchName])))> 0
DBA拥有关注的是,内部的选择:。
SELECT
[v_Movie] [iMovieID] AS [ 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] AS [iMovieID ],
[v_Movie] [vchName] AS [vchName],
[v_Movie] [dtInsertDate] AS [dtInsertDate]
FROM [DBO]。[v_Movie] AS [v_Movie]
WHERE(CAST(CHARINDEX (N'Ocean',[Extent1]。[vchName])AS int))> 0
我使用以下SQL填充100,000个记录的表,但在执行LINQ查询时未注意到任何性能下降。探查表明,查询下一个第二RAN:
BEGIN
DECLARE @counter诠释
组@counter = 0
而@counter 开始
组@counter = @counter + 1
INSERT INTO t_Movie(vchName)的值( '电影' + CONVERT(VARCHAR,@计数器))
端
END
这是一个有效的担忧吗?
PS -
(CAST(CHARINDEX(N'Ocean”,[Extent1] [vchName])为INT)。) 这里不是问题,因为在LINQ到实体查询我用只是为了说明。
任何见解将使用XML编辑器非常感激