Tìm kiếm kí tự không dấu trong LinQ Entity Framework

Đầ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.


Devwork.vn - Đồng hành cùng developer Việt Nam

Đăng tuyển miễn phí

Scan để xem trên điện thoại

Hotline: 02462900388

Hotline: 02462911388

Email: system@devwork.vn

BÀI VIẾT LIÊN QUAN

Làm thế nào để giữ tình yêu với nghề lập trình viên?

Làm thế nào để giữ tình yêu với nghề lập trình viên?

Liệu khi bạn 40 tuổi, lửa đam mê trong bạn đối với nghề lập trình còn rạo rực như thuở bản đầu.

Ngồi lâu: lợi bất cấp hại cho lập trình viên

Ngồi lâu: lợi bất cấp hại cho lập trình viên

Mỗi ngày các lập trình viên đều đối diện với những nguy cơ tiềm ẩn về bệnh tật do ngồi nhiều và làm việc liên tục với máy tính.

Devwork xuất sắc giành Danh Hiệu Sao Khuê 2020

Devwork xuất sắc giành Danh Hiệu Sao Khuê 2020

Tròn 1 năm ra mắt thị trường tuyển dụng, sản phẩm của chúng tôi đã xuất sắc nhận được công nhận Danh hiệu Sao Khuê trong lĩnh vực Giải pháp phần mềm mới do VINASA. Là một nền tảng công nghệ tuyển dụng dành riêng cho ngành IT, với sứ mệnh là Giải pháp tuyển dụng 4.0 là dịch vụ tuyển dụng thời đại 4.0 với Tốc độ, Chất lượng, và Chi phí tối ưu nhất trong các Recruitment Agency tại Việt Nam.

Nhân viên IT giỏi được doanh nghiệp sẵn sàng chi lương nghìn đô

Nhân viên IT giỏi được doanh nghiệp sẵn sàng chi lương nghìn đô

80% vị trí tuyển dụng trong ngành CNTT sẵn sàng trả mức lương lên tới hơn 26,3 triệu đồng mỗi tháng.

Bài học từ đoàn quân mặc áo đỏ cho developer

Bài học từ đoàn quân mặc áo đỏ cho developer

Kể từ đầu năm 2018 đến nay, bóng đá Việt Nam nếm trái ngọt liên tiếp. Á quân U23 châu Á - Quán quân AFF CUP 2018 và bây giờ là lọt vào vòng tứ kết Asian Cup 2019. Developer liên quan gì đến câu chuyện này...

TOP TỪ KHÓA

tuyển dụng kỹ sư cầu nối ITviec tuyển dụng java developer Tuyen developer backend Tìm việc it Thực tập sinh PHP Tuyển C# wfh tìm việc online work for home Humance Resource Quản trị nhân sự Tuyển nodejs Front-end Developer tuyển dụng thực tập IOS remote work Tuyen web developer Tuyen developer IBM tuyển dụng IT Tuyển dụng unity Tuyen dung sennior java developer Tuyển dụng solidity Tuyen dung IOS Tuyen dung Ruby on rails Tuyen dung Android tuyển dụng thực tập java Tuyển dụng lập trình viên Tuyển dụng C# tuyển dụng Automation Test bài test front end

Bình luận

TIN TỨC LIÊN QUAN