Utilisation de caractères génériques avec un LinqDataSource

J’ai actuellement un LinqDataSource sur une page ASP.NET qui est utilisée comme source de données pour un FormView. Je dois modifier dynamicment la clause where fonction des parameters transmis via la chaîne de requête. Je fonctionne très bien, sauf que je veux que l’utilisateur final puisse utiliser des caractères génériques:

  • UNE “?” est utilisé pour représenter un seul caractère.
  • Un “*” représente plusieurs caractères.

Cela semble assez facile, tout ce que je dois faire utilise l’opérateur LIKE et le remplace ? avec _ (correspond à un seul caractère) et * avec % (correspond à tous les caractères).

Ci-dessous est la méthode qui fait le jeu de jambes de fantaisie (qui s’appelle sur PageLoad ), et cela fonctionne très bien sauf que mes jokers sont échappés.

 private void ApplyFilter(ref LinqDataSource lds) { if (Request.QuerySsortingng.Keys.Count > 0) { ssortingng where = ""; int counter = 0; foreach (ssortingng key in Request.QuerySsortingng.Keys) { if (Request.QuerySsortingng[key] != "") { if (counter == 0) { where += key + ".Contains(@" + key + ")"; } else { where += " AND " + key + ".Contains(@" + key + ")"; } lds.WhereParameters.Add(key, Request.QuerySsortingng[key].Replace("?", "_").Replace("*", "%")); counter++; } } if (where != "") lds.Where = where; } } 

Vous trouverez ci-dessous la requête générée à partir de cette chaîne de requête: .aspx?LOOP_DESCRIPTION=*&LOOP=*&AREA=01

 exec sp_executesql N'SELECT [t1].[AREA], [t1].[LOOP], [t1].[LOOP DESCRIPTION] AS [LOOP_DESCRIPTION] FROM ( SELECT ROW_NUMBER() OVER (ORDER BY [t0].[AREA], [t0].[LOOP], [t0].[LOOP DESCRIPTION]) AS [ROW_NUMBER], [t0].[AREA], [t0].[LOOP], [t0].[LOOP DESCRIPTION] FROM [dbo].[INSTRUMENT LOOP DESCRIPTION] AS [t0] WHERE ([t0].[LOOP DESCRIPTION] LIKE @p0 ESCAPE ''~'') AND ([t0].[LOOP] LIKE @p1 ESCAPE ''~'') AND ([t0].[AREA] LIKE @p2) ) AS [t1] WHERE [t1].[ROW_NUMBER] BETWEEN @p3 + 1 AND @p3 + @p4 ORDER BY [t1].[ROW_NUMBER]',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 int,@p4 int',@p0=N'%~%%',@p1=N'%~%%',@p2=N'%01%',@p3=0,@p4=1 

Comme vous pouvez le constater par le paramétrage, mes caractères génériques sont échappés avec le caractère tilde:

 @p0=N'%~%%',@p1=N'%~%%',@p2=N'%01%' 

Ma question est la suivante: est-il possible d’empêcher les caractères _ et % de s’échapper?

S’il vous plaît essayez url decode Request.QuerySsortingng[key]

Exemple:

 HttpUtility.UrlDecode(Request.QuerySsortingng[key]); 

J’ai enfin réussi à comprendre cela. Grâce à une classe de ce post , je suis en mesure d’utiliser l’événement LinqDataSource_Selecting et de filtrer mes données avec succès, les jokers fonctionnant à l’aide de ce code:

 protected void ldsData_Selecting(object sender, LinqDataSourceSelectEventArgs e) { var result = db.INSTRUMENT_LOOP_DESCRIPTIONs.AsQueryable(); foreach (ssortingng key in Request.QuerySsortingng.Keys) { if (Request.QuerySsortingng[key].Trim() != "") { result = result.WhereLike(key, Request.QuerySsortingng[key].Replace("?", "_").Replace("*", "%")); } } e.Result = result; }