Nó từng là trường hợp cho các phiên bản cũ hơn của lõi EF. Bây giờ string.Contains
có phân biệt chữ hoa chữ thường và đối với exemple cho sqlite, nó ánh xạ tới hàm sqlite `direction () '(tôi không biết đối với postgresql).
Nếu bạn muốn so sánh các chuỗi theo cách không phân biệt chữ hoa chữ thường, bạn có DbFunctions để thực hiện công việc.
context.Counties.Where(x => EF.Functions.Like(x.Name, $"%{keyword}%")).ToList();
CẬP NHẬT lên @Gert:
Một phần của giả định trong câu hỏi là không chính xác. string.Contains
KHÔNG chuyển đổi thành LIKE expression
mặc dù nó ĐƯỢC SỬ DỤNG là trường hợp trong các phiên bản ef core <=1.0 (tôi nghĩ).
- Trong SQLServer
string.contains
chuyển đổi thànhCHARINDEX()
, trong oracle và sqlite thànhinstr()
phân biệt chữ hoa chữ thường theo mặc định UNLESS db hoặc đối chiếu cột được định nghĩa khác (Xin nhắc lại, tôi không biết đối với postgresql). - Trong mọi trường hợp
EF.Functions.Like()
chuyển đổi thành mộtLIKE
trong SQL theo mặc định, biểu thức không phân biệt chữ hoa chữ thường trừ khi đối chiếu db hoặc cột được định nghĩa theo cách khác.
Vì vậy, vâng, tất cả sẽ đi đến đối chiếu nhưng - hãy sửa cho tôi nếu tôi sai - theo cách mà mã có thể ảnh hưởng đến tìm kiếm phân biệt chữ hoa chữ thường / không nhạy cảm tùy thuộc vào phương pháp bạn sử dụng.
Bây giờ, tôi có thể không hoàn toàn cập nhật nhưng tôi không nghĩ rằng việc di chuyển lõi EF đối phó với đối chiếu DB một cách tự nhiên và trừ khi bạn đã tạo bảng theo cách thủ công, bạn sẽ kết thúc với đối chiếu mặc định (phân biệt chữ hoa chữ thường đối với sqlite và tôi thành thật mà nói thì không biết cho những người khác).
Quay lại câu hỏi ban đầu, bạn có ít nhất 2 lựa chọn để thực hiện tìm kiếm không phân biệt chữ hoa chữ thường này nếu không phải là 3 trong một bản phát hành trong tương lai:
- Chỉ định đối chiếu cột khi tạo bằng DbContext.OnModelCreating () bằng thủ thuật này
- Thay thế chuỗi
string.Contains
của bạn bởiEF.Functions.Like()
- Hoặc đợi một tính năng đầy hứa hẹn vẫn đang được thảo luận:
EF.Functions.Collate()
chức năng