实体框架,可变标准运行得慢得多

时间:2015-06-26 10:31:37

标签: sql-server linq-to-entities

以下运行速度非常快<0.3s,谓词条件中的常量

IQueryable<fn_GetDocumentsForContact_Result> _queriable;
var zeus = new Zeus();
var UoW = new UnitOfWork(zeus);
var sp = new StoredProcedureService(zeus);

int _userId = 183494;
int totalRecords = 0;
int doctype = 2;

var predicate = PredicateBuilder.True<fn_GetDocumentsForContact_Result>();

predicate = predicate.And(x=>x.Type == 2);

IQueryable<fn_GetDocumentsForContact_Result> documents = 
    sp.fn_GetDocumentsForContact(183494)
    .AsExpandable()
    .Where(predicate);

_queriable = documents;

_queriable.Count().Dump();

生成以下SQL:

-- Region Parameters
DECLARE @ctcIDnumber Int = 183494
DECLARE @p__linq__0 Int = 2
-- EndRegion
SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[fn_GetDocumentsForContact](@ctcIDnumber) AS [Extent1]
        WHERE [Extent1].[Type] = @p__linq__0
    )  AS [GroupBy1]

如果我改变:

predicate = predicate.And(x=>x.Type == 2);

predicate = predicate.And(x=>x.Type == doctype);

仍会生成相同的SQL,但数据库连接超时。

SQL在SSMS内运行非常快,我尝试清除查询缓存并通过sp_executeSQL运行SQL,在两种情况下查询都会在1秒内完成。删除LinqKit谓词构建器也没有区别。

我最初的直觉本来就是参数嗅探,但是,有问题的查询只调用Inline TVF,我的理解是PS只适用于编译的sprocs。

0 个答案:

没有答案