J'ai commencé à utiliser dapper.net il y a quelque temps pour des raisons de performances et j'aime beaucoup la fonction de paramètres nommés par rapport à la simple exécution de "ExecuteQuery" dans LINQ To SQL.
Il fonctionne très bien pour la plupart des requêtes mais j'obtiens de temps en temps des timeouts vraiment étranges. Le plus étrange est que ce timeout ne se produit que lorsque le SQL est exécuté via dapper. Si je prends la requête exécutée copiée à partir du profileur et que je l'exécute dans Management Studio, elle est rapide et fonctionne parfaitement. Et ce n'est pas seulement un problème temporaire. La requête fait constamment l'objet d'un timeout via dapper et fonctionne toujours parfaitement dans 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
C'est la requête que j'ai copié-collé de SQL Profiler. Je l'exécute comme ceci dans mon code.
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();
}
Je ne sais pas par où commencer. Je suppose qu'il doit y avoir quelque chose qui se passe avec dapper puisqu'il fonctionne bien quand j'exécute simplement le code.
Comme vous pouvez le voir dans cette capture d'écran. Il s'agit de la même requête exécutée via le code d'abord et ensuite via Management Studio.
Je peux également ajouter que cela ne se produit (je pense) que lorsque j'ai deux mots ou plus ou lorsque j'ai un caractère "stop" dans la chaîne de recherche. Il se peut donc que cela ait quelque chose à voir avec la recherche en texte intégral, mais je n'arrive pas à trouver comment le déboguer puisque cela fonctionne parfaitement depuis Management Studio.
Et pour aggraver les choses, cela fonctionne bien sur mon hôte local avec une base de données presque identique, à la fois dans le code et dans Management Studio.