สำหรับคนที่เกลือกกลิ้งที่นี่อย่างฉันกำลังมองหาวิธี "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();
ดังนั้นสำหรับความต้องการของฉันฉันได้เขียนวิธีการช่วยเหลือ / ส่วนขยาย
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-likeเป็นคำเหมือนได้ไหม