Per coloro come se stessi qui come me, cercando un modo per un metodo "SQL Like" in LINQ, ho qualcosa che funziona molto bene.
Sono in un caso in cui non è possibile modificare il database in alcun modo per modificare le regole di confronto delle colonne. Quindi devo trovare un modo nel mio LINQ per farlo.
Sto usando il metodo di supporto SqlFunctions.PatIndex
strega agire in modo simile al vero operatore SQL LIKE.
prima ho bisogno elencare tutti i possibili segni diacritici (una parola che ho appena appreso) del valore di ricerca per ottenere qualcosa di simile:
déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
e poi in LINQ per 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();
Quindi per le mie esigenze ho scritto un metodo 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;
}
}
Se qualcuno di voi ha suggerito di migliorare questo metodo, sarò felice di sentirvi.
La tua domanda ha almeno 5 voti per il tag [tag: like-operator]. Potrei cortesemente chiedere di suggerire [tag: sql-like] come [sinonimo] (http://stackoverflow.com/tags/like-operator/synonyms)? – Kermit
Ovviamente. Fatto. –