So sánh chuỗi với StringComparison.OrdinalIgnoreCase
hoạt động trong bộ nhớ hoặc với IEnumerable<T>
. Bạn đang cố gắng sử dụng nó với IQueryable<T>
, nhưng nhà cung cấp truy vấn của bạn không hiểu nó.
Trong LINQ-to-SQL bạn sẽ có thể sử dụng SqlMethods.Like(s.UserName, userName)
, như thế này:
var user = db.Users.FirstOrDefault(s => SqlMethods.Like(s.UserName, userName));
SqlMethods là trong không gian tên System.Data.Linq.SqlClient.
Phương pháp Like
không phân biệt chữ hoa chữ thường, vì vậy bạn sẽ nhận được kết quả mong đợi.
EDIT : I tried and get "LINQ to Entities does not recognize the method Boolean Like(System.String, System.String)
method, and this method cannot be translated into a store expression."
Đây dường như là vấn đề đã biết với EF (link).
This works for me:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
Nó xuất hiện rằng mặc dù EF có thời gian khó dịch tĩnh Equals
to SQL, nó không có vấn đề dịch dụ Equals
. Đây là một tìm kiếm rất tốt - nó làm cho một giải pháp dễ đọc, hiệu quả.
Bạn cũng có thể sử dụng một phương pháp đơn giản hơn với ToUpperCase
hoặc ToLowerCase
, nhưng điều đó có thể ngăn chặn tối ưu truy vấn từ việc sử dụng các chỉ số:
// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());
Bạn đã xác nhận tên người dùng và s.Username là kiểu string. – Tilak
L2S chắc chắn không hỗ trợ phương thức cụ thể đó. Nếu đây là mã C# thực thi thực tế và không phải là một cái gì đó được dịch bởi một nhà cung cấp truy vấn thì nó sẽ ổn thôi. – Servy
Tại sao bạn đang cố gắng tránh sử dụng chuỗi.Compare? – tsells