我一段时间前开始使用dapper.net,出于性能原因,我真的很喜欢与LINQ To SQL中的ExecuteQuery
相比,它具有命名参数功能。
对于大多数查询,它都运行得很好,但是有时会出现一些非常奇怪的超时问题。最奇怪的是,只有在通过dapper执行SQL时才会发生此超时。如果我将从分析器中复制的执行查询仅在Management Studio中运行,它就会快速且完美地工作。而且这不仅仅是暂时的问题。查询通过dapper始终超时,并且在Management Studio中始终正常工作。
exec sp_executesql N'SELECT Item.Name,dbo.PlatformTextAndUrlName(Item.ItemId) As PlatformString,dbo.MetaString(Item.ItemId) As MetaTagString, Item.StartPageRank,Item.ItemRecentViewCount
NAME_SRCH.RANK as NameRank,
DESC_SRCH.RANK As DescRank,
ALIAS_SRCH.RANK as AliasRank,
Item.itemrecentviewcount,
(COALESCE(ALIAS_SRCH.RANK, 0)) + (COALESCE(NAME_SRCH.RANK, 0)) + (COALESCE(DESC_SRCH.RANK, 0) / 20) + Item.itemrecentviewcount / 4 + ((CASE WHEN altrank > 60 THEN 60 ELSE altrank END) * 4) As SuperRank
FROM dbo.Item
INNER JOIN dbo.License on Item.LicenseId = License.LicenseId
LEFT JOIN dbo.Icon on Item.ItemId = Icon.ItemId
LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, name, @SearchString) NAME_SRCH ON
Item.ItemId = NAME_SRCH.[KEY]
LEFT OUTER JOIN FREETEXTTABLE(dbo.Item, namealiases, @SearchString) ALIAS_SRCH ON
Item.ItemId = ALIAS_SRCH.[KEY]
INNER JOIN FREETEXTTABLE(dbo.Item, *, @SearchString) DESC_SRCH ON
Item.ItemId = DESC_SRCH.[KEY]
ORDER BY SuperRank DESC OFFSET @Skip ROWS FETCH NEXT @Count ROWS ONLY',N'@Count int,@SearchString nvarchar(4000),@Skip int',@Count=12,@SearchString=N'box,com',@Skip=0
这是我从SQL Profiler复制粘贴的查询。我在我的代码中像这样执行它。
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Conn"].ToString()))
{
connection.Open();
var items = connection.Query<MainItemForList>(query, new { SearchString = searchString, PlatformId = platformId, _LicenseFilter = licenseFilter, Skip = skip, Count = count }, buffered: false);
return items.ToList();
}
我不知道该从哪里开始。我猜想,由于当我仅执行代码时它能正常工作,所以必须与Dapper有关。
正如您在此屏幕截图中看到的那样。这是通过Code First和Management Studio执行的相同查询。
stop
字符时发生。所以这可能与全文搜索有关,但我无法找出如何调试它,因为在管理工具中它完美地运行。更糟糕的是,在我的本地主机上,使用几乎相同的数据库,从代码和管理工具中都可以正常工作。
connection.Execute("SET CONCAT_NULL_YIELDS_NULL ON");
,然后(其余代码); 您还可以使用“SET”指令前缀单个命令。但请注意,并非所有“SET”选项都会被sp_reset_connection
重置(当连接被重用时自动执行) - 例如(特别是)SET TRANSACTION ISOLATION LEVEL {blah};
即使在连接重置之间也会持续存在,这可能会很有趣。 - Marc Gravell