Для тих, хто переживає тут, як я, шукаючи спосіб "SQL Like" методу в LINQ, у мене є щось, що працює дуже добре.
Я в тому випадку, коли я не можу жодним чином змінити Базу даних для зміни зіставлення стовпців. Тому я повинен знайти спосіб у своєму LINQ зробити це.
Я використовую хелперний метод, який SqlFunctions.PatIndex
діє аналогічно реальному оператору SQL LIKE.
Спочатку мені потрібно перерахувати всі можливі діакритики (слово, яке я тільки що дізнався) у значенні пошуку, щоб отримати щось на кшталт:
déjà => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
а потім у LINQ для приклад:
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();
Тому для моїх потреб я написав метод 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;
}
}
Якщо хтось із вас пропонує запропонувати вдосконалити цей метод, я прошу вас почути.
5
голосів за тег " оператор" . Чи можу я просити Вас , що ви пропонуєте SQL-подібний як синонім ?