Für diejenigen, die hier wie ich nach einem Weg zu einer "SQL Like" -Methode in LINQ suchen, gibt es etwas, das sehr gut funktioniert.
Ich bin in einem Fall, in dem ich die Datenbank in keiner Weise ändern kann, um die Spaltenkollatierung zu ändern. Also muss ich in meinem LINQ einen Weg finden, dies zu tun.
Ich verwende die Hilfsmethode, SqlFunctions.PatIndex
die sich ähnlich wie der echte SQL LIKE-Operator verhält.
Zuerst muss ich alle möglichen diakritischen Zeichen (ein Wort, das ich gerade gelernt habe) im Suchwert aufzählen, um Folgendes zu erhalten:
déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
und dann in LINQ zum Beispiel:
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();
Für meine Bedürfnisse habe ich eine Helper / Extension-Methode geschrieben
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;
}
}
Wenn einer von Ihnen Vorschläge zur Verbesserung dieser Methode hat, werde ich mich freuen, Sie zu hören.
5
Stimmen für das Like-Operator- Tag. Könnte ich Sie bitten , SQL-like als Synonym vorzuschlagen ?