以下运行速度非常快<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。