2013-10-26 32 views
15

Dựa trên câu trả lời cho câu hỏi này:So sánh chuỗi không phân biệt chữ hoa chữ thường không hoạt động trong C#?

How can I do a case insensitive string comparison?

Tôi đang cố gắng để làm một so sánh case-insensitive mà không sử dụng so sánh hoặc ToLower:

var user = db.Users.FirstOrDefault(s => String.Equals(s.Username, username, StringComparison.OrdinalIgnoreCase)); 

Tuy nhiên tôi nhận được một lỗi:

Incorrect number of arguments supplied for call to method 'Boolean Equals(System.String, System.String, System.StringComparison)'

Tôi đang làm gì sai?

+0

Bạn đã xác nhận tên người dùng và s.Username là kiểu string. – Tilak

+1

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

+0

Tại sao bạn đang cố gắng tránh sử dụng chuỗi.Compare? – tsells

Trả lời

33

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()); 
+1

Cảm ơn vì điều này. Tôi đã thử và nhận được "LINQ to Entities không nhận ra phương thức 'Boolean Like (System.String, System.String)' phương pháp, và phương pháp này không thể được dịch sang một biểu thức cửa hàng." - suy nghĩ? – SB2055

+0

Điều này làm việc cho tôi: db.Users.FirstOrDefault (s => s.Username.Equals (tên người dùng, StringComparison.OrdinalIgnoreCase)); Tôi không biết phải làm gì trong việc chọn câu trả lời - cảm thấy tự do để lưu ý điều này và tôi có thể kiểm tra xem bạn có đi không? – SB2055

+0

Bạn có nói rằng có bất cứ điều gì sai trái với giải pháp tôi đã đăng trong bình luận không? Tôi đang tìm kiếm một giải pháp thực hiện đơn giản, tuân theo các phương pháp hay nhất. – SB2055

Các vấn đề liên quan