下面的C#代码在3秒内执行。我列出了SQL Profiler输出。如果我将语句更改为不使用动态SQL,它将以毫秒为单位执行。我找不到任何好的资源来解决这个问题。但是我能够找到一篇文章来解释动态SQL,因为解析器不知道参数的值,所以无法优化查询计划。我该如何解决这个linq查询的性能问题?
public string GetIncorporation(Parcel parcel)
{
var result = (from c in _context.Districts
where c.PARCEL_ID == parcel.PARCEL_ID && c.DB_YEAR == parcel.DB_YEAR && c.DISTRICT_CD.CompareTo("9000") < 0
select c).ToList();
exec sp_executesql N'SELECT
[GroupBy1].[A1] AS [C1]
FROM (SELECT
MAX([Filter1].[A1]) AS [A1]
FROM (SELECT
SUBSTRING([Extent1].[DISTRICT_CD], 0 + 1, 2) + N''00'' AS [A1]
FROM [STAGE].[DISTRICT] AS [Extent1]
WHERE ([Extent1].[PARCEL_ID] = @p__linq__0) AND ([Extent1].[DB_YEAR] = @p__linq__1) AND ([Extent1].[DISTRICT_CD] < N''9000'')
) AS [Filter1]
) AS [GroupBy1]',N'@p__linq__0 nvarchar(4000),@p__linq__1 int',@p__linq__0=N'0001-02-0003',@p__linq__1=2012
我试图建立一个服务层。我不想混合使用一批存储过程和Linq查询
是的,我做到了。它建议我在DB_YEAR上创建一个索引,包括PARCEL_ID,DISTRICT_CD – 2012-03-13 15:27:12
事情是...我已经有了一个索引PARCEL_ID,DB_YEAR,DISTRICT_CD这是动态查询的t-sql版本使用的。 – 2012-03-13 15:28:30