Tìm kiếm kí tự không dấu trong LinQ Entity Framework
Các bạn vẫn thường sử dụng LinQ với Entity Framework để tìm kiếm ký tự và chuỗi, nhưng có một vấn đề là khi các bạn tìm từ khoá không dấu để ra có dấu thì không được. Mình xin đưa ra một số giải pháp.
Đầu tiên khi chúng ta muốn tìm kiếm chữ "đào tạo" trong CSDL thì rất đơn giản chúng ta chỉ cần sử dụng LinQ bằng mệnh đề where ví dụ:
var query = db.Categories.Where(c=>c.Name.Contains(keyword));
Nhưng khi chúng ta muốn người dùng chỉ cần gõ chữ "dao tao" thì phải ra được kết quả có chữ "đào tạo" như ý muốn thì lại không được. Ở đây chúng ta có 1 số giải pháp như sau:
Cách thứ nhất: Set collation cho cột trên bảng cần tìm kiếm là "SQL_Latin1_General_CP1_CI_AI"
Cách thứ hai: Chúng ta sử dụng delegate trong mệnh đề where, trong delegate sẽ sử dụng hàm chuyển đổi tiếng Việt sang chữ không dấu rồi so sánh:
Đầu tiên chúng ta có mệnh đề where như sau:
var query = db.Categories.Where(delegate (Category c)
{
if (ConvertToUnSign(c.Name).IndexOf(filter, StringComparison.CurrentCultureIgnoreCase) >= 0)
return true;
else
return false;
}).AsQueryable();
Hàm ConvertToUnsign chúng ta có nội dung như sau:
private string ConvertToUnSign(string input)
{
input = input.Trim();
for (int i = 0x20; i < 0x30; i++)
{
input = input.Replace(((char)i).ToString(), " ");
}
Regex regex = new Regex(@"\p{IsCombiningDiacriticalMarks}+");
string str = input.Normalize(NormalizationForm.FormD);
string str2 = regex.Replace(str, string.Empty).Replace('đ', 'd').Replace('Đ', 'D');
while (str2.IndexOf("?") >= 0)
{
str2 = str2.Remove(str2.IndexOf("?"), 1);
}
return str2;
}
Cách thứ ba: Chúng ta tạo sẵn trường dữ liệu không dấu tương ứng với cột dữ liệu để tìm kiếm dạng OR:
var query = db.Categories.Where(c=>c.Name.Contains(keyword) || c.NameUnsigned.Contains(keyword));
Kết luận:
Đối với 3 cách này thì mình thích dùng cách thứ 2 nhất vì nó tiện lợi, chúng ta không can thiệp trực tiếp vào DB như cách 1 và cũng không cần phải lưu dư thừa dữ liệu như cách 3 nhưng tốc độ đương nhiên không nhanh như cách 1 và 3 vì mỗi lần tìm kiếm lại phải chuyển đổi. Các bạn có thể cân nhắc 1 trong 3 cách để chúng ta vận dụng phù hợp nhất theo từng dự án.
Tác giả: Bạch Ngọc Toàn
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.
Tags:
Bài viết liên quan
Nâng cấp RAG thành Agentic RAG với Dynamic Toolcall | Xây dựng RAG AI
Vậy làm thế nào để nâng cấp RAG thành một hệ thống Agentic RAG thông minh hơn, có khả năng tự động quyết định khi nào và nên gọi tool nào? Câu trả lời chính là Dynamic Toolcall.
Đọc thêm
Tối ưu kết quả trả về từ VectorDB với Scoring và Fingerprint | Xây dựng RAG AI
Đến Phần 3 này, chúng ta sẽ cùng nâng cấp khả năng tìm kiếm và truy vấn dữ liệu từ VectorDB.
Đọc thêmTrang bị Memory cho RAG bằng Vector Database với Qdrant
Ở phần tiếp theo này, chúng ta sẽ tiến thêm một bước quan trọng: trang bị bộ nhớ (Memory) cho RAG bằng cách sử dụng Vector Database Qdrant.
Đọc thêm
Hướng dẫn tạo ứng dụng ASP.NET Core (.NET 8) và chuẩn bị kết nối OpenAI Chat Model để xây dựng RAG AI
Trong bài viết này, chúng ta sẽ bắt đầu một hành trình nhỏ: xây dựng một ứng dụng RAG AI (Retrieval-Augmented Generation).
Đọc thêm
Ra mắt khóa học: TEDU-53: Xây dựng ứng dụng CMS với ASP.NET Core 8.0 + Angular.
Ngay bây giờ các bạn có thể đăng ký thông qua mã giảm giá tại trang chi tiết khóa học. Mã giảm giá sẽ được vô hiệu hóa khi đủ số lượng người theo thang bậc.
Đọc thêm
10 thủ thuật để tăng tốc độ ứng dụng .NET Core 3.x
Trong bài viết này mình sẽ đưa ra 10 mẹo để giúp bạn tăng tốc ứng dụng ASP.NET Core 3.
Đọc thêm
Migrate hệ thống ASP.NET Core 2.2 lên 3.1
Bài viết này mình đúc kết lại sau khi migrate toàn bộ hệ thống TEDU hiện tại từ .NET Core 2.2 lên 3.1 chia sẻ lại để mọi người cùng trao đổi
Đọc thêm
Tìm hiểu Unit Testing trong ASP.NET Core
Tiếp theo bài viết trước với tiêu đề Tìm hiểu về Dependency Injection trong ASP.NET Core. Hôm nay mình sẽ tập trung vào unit test.
Đọc thêm
Tìm hiểu về Dependency Injection trong ASP.NET Core
Bài viết này chúng ta sẽ cùng tìm hiểu về những điều thú vị xung quanh depedency injection và unit testing.
Đọc thêm
Cách sử dụng Yarn trong Visual Studio 2017
Cách sử dụng Yarn để quản lý các dependencies trong Visual Studio 2017
Đọc thêm