Der String-Vergleich mit StringComparison.OrdinalIgnoreCase
funktioniert im Speicher oder mit IEnumerable<T>
. Sie versuchen, es mit IQueryable<T>
zu verwenden, aber der Provider Ihrer abfragbaren versteht es nicht.
In Linq-to-Sql sollten Sie in der Lage sein SqlMethods.Like(s.UserName, userName)
zu verwenden, wie folgt aus:
var user = db.Users.FirstOrDefault(s => SqlMethods.Like(s.UserName, userName));
SqlMethods ist im System.Data.Linq.SqlClient Namespace.
Die Like
Methode ist case-insensitive, so sollten Sie das erwartete Ergebnis erhalten.
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."
Dies scheint mit EF (link) ein bekanntes Problem zu sein.
This works for me:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
Es scheint, dass, obwohl EF schwer übersetzen die statische Equals
zu SQL hat, ist es kein Problem Equals
übersetzen die Instanz hat. Dies ist ein sehr guter Fund - es macht eine leicht lesbare, performante Lösung.
Sie könnten auch eine einfachere Methode, mit ToUpperCase
oder ToLowerCase
, verwenden aber das kann Abfrage-Optimierer verwenden Indizes verhindern:
// Warning: this may not perform well.
var user = db.Users.FirstOrDefault(s => s.UserName.ToUpperCase() == userName.ToUpperCase());
Haben Sie diesen Benutzernamen überprüft und s.username sind vom Typ String. – Tilak
Ziemlich sicher L2S unterstützt diese bestimmte Methode nicht. Wenn dies tatsächlich ausführbarer C# -Code wäre und nicht etwas, das von einem Abfrage-Provider übersetzt wird, wäre es in Ordnung. – Servy
Warum versuchen Sie, string.Compare zu vermeiden? – tsells