Pour ceux qui dégringolent ici comme moi à la recherche d'un moyen pour une méthode "SQL Like" dans LINQ, j'ai quelque chose qui fonctionne très bien.
Je suis dans un cas où je ne peux en aucun cas modifier la base de données pour modifier le classement des colonnes. Je dois donc trouver un moyen dans mon LINQ de le faire.
J'utilise la méthode d'assistance SqlFunctions.PatIndex
qui agit de la même manière que le véritable opérateur SQL LIKE.
J'ai d'abord besoin d'énumérer tous les signes diacritiques possibles (un mot que je viens d'apprendre) dans la valeur de recherche pour obtenir quelque chose comme:
déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
puis dans LINQ par exemple:
var city = "montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l";
var data = (from loc in _context.Locations
where SqlFunctions.PatIndex(city, loc.City) > 0
select loc.City).ToList();
Donc, pour mes besoins, j'ai écrit une méthode Helper / Extension
public static class SqlServerHelper
{
private static readonly List<KeyValuePair<string, string>> Diacritics = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>("A", "aàâäAÀÂÄ"),
new KeyValuePair<string, string>("E", "éèêëeÉÈÊËE"),
new KeyValuePair<string, string>("U", "uûüùUÛÜÙ"),
new KeyValuePair<string, string>("C", "cçCÇ"),
new KeyValuePair<string, string>("I", "iîïIÎÏ"),
new KeyValuePair<string, string>("O", "ôöÔÖ"),
new KeyValuePair<string, string>("Y", "YŸÝýyÿ")
};
public static string EnumarateDiacritics(this string stringToDiatritics)
{
if (string.IsNullOrEmpty(stringToDiatritics.Trim()))
return stringToDiatritics;
var diacriticChecked = string.Empty;
foreach (var c in stringToDiatritics.ToCharArray())
{
var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c));
if (string.IsNullOrEmpty(diac.Key))
continue;
//Prevent from doing same letter/Diacritic more than one time
if (diacriticChecked.Contains(diac.Key))
continue;
diacriticChecked += diac.Key;
stringToDiatritics = stringToDiatritics.Replace(c.ToString(), "[" + diac.Value + "]");
}
stringToDiatritics = "%" + stringToDiatritics + "%";
return stringToDiatritics;
}
}
Si vous avez des suggestions pour améliorer cette méthode, je serai ravi de vous entendre.
5
votes pour le tag d' opérateur similaire . Puis-je vous demander de suggérer comme sql-like comme synonyme ?