2009-04-17 72 views
2

我已经将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编辑器非常感激

回答

1

看看你.edmx文件。您会在影片视图中找到某处有视图的选择语句。删除select语句,并使其余的视图XML看起来更像您的表格。你正在得到这个内部选择,因为EF天真地认为你试图将列映射到视图中的不同名称而不是默认名称。