2010-02-04 8 views
11

Ich habe Probleme beim Abrufen von Daten mit LINQ-to-SQL. Ich verwende den folgenden Code ein Benutzer für unsere Web-App zu sehen (Benutzername ist E-Mail-Adresse):Wie ignoriert man den Fall mit LINQ-to-SQL?

var referenceUser = 
    db.ReferenceUsers 
     .SingleOrDefault(rf => rf.Email == values["emailAddress"]); 

Wenn ich [email protected] Typ I eine ReferenceUser aber, wenn ich [email protected] tippe ich nicht. Wie kann ich LINQ dazu bringen, den Fall bei der Auswahl eines Benutzers zu ignorieren?

+0

Werfen Sie einen Blick auf http://stackoverflow.com/questions/841226/case-insensitive-string-compare-in-linq-to-sql –

+1

Morgen? Es ist 16 Uhr, wo ich bin. – Oded

+0

Wie können Sie die Groß- und Kleinschreibung für diese Spalte in der Datenbank aktivieren? Wir leben leider immer noch in Zeiten, in denen eine solche Feinabstimmung notwendig ist. Die Datenbank muss wissen, ob eine Spalte die Groß-/Kleinschreibung nicht beachtet oder nicht, wenn sie die Indizierung für sie aktiviert. – herzmeister

Antwort

15

Does:

var referenceUser = 
    db.ReferenceUsers.SingleOrDefault(
     rf => rf.Email.ToUpper() == values["emailAddress"].ToUpper()); 

Arbeit?

Die ToUpper() sollte in das richtige SQL übersetzt werden, um als Datenbankabfrage ausgeführt werden, und dann beide Ergebnisse zurückgeben.

+0

Das würde ich tun, wenn ich nicht wüsste, dass es ein Flag für die ignore case gibt, aber +1 für die Idee. –

+1

@David - wie Sie Dinge in LINQ vergleichen, da der an SingleOrDefault gesendete Lambda-Ausdruck übersetzt wurde. Dieser Weg wird sicher in SQL übersetzt. – codekaizen

+0

Funktioniert gut. Bei anderen String-Vergleichen, die nicht in Lambdas enthalten sind, sollte ich bei ToLower() bleiben oder StringComparison.OrdinalIgnoreCase ?? –

5
var referenceUser = db.ReferenceUsers.SingleOrDefault(rf => string.Compare(rf.Email, values["emailAddress"],true)==0); 

Wo die „wahre“, ob Fall zu ignorieren ist oder nicht

+0

Just Als ein Punkt der Überlegung glaube ich nicht, dass dies auf dem Server laufen würde. Ich erinnere mich, dieses Muster zu verwenden und die Abfrage nicht korrekt interpretiert zu bekommen. – codekaizen

+5

Anscheinend wird diese Antwort gewählt, die SO-Leserschaft ist ziemlich wohl mit .NET-Idiomen, aber weniger mit LINQ auf IQueryable. – codekaizen

0

Dies ist, wie ich es tat. Könnte dir einen Hinweis geben. Ich habe eine Liste mit Profilen und möchte nach Profilnamen suchen, die "aR", "Ar" oder "AR" enthalten.

List<Profile> profileList = CreateProfile(); 
string search = "aR".ToLower(); 

profileList = (from p in profileList where p.Name.ToLower().Contains(search) 
     orderby p.Name select p).ToList(); 
-1
listTasks.ItemsSource 
    = taskList.Where(x => x.TaskDescription.ToLower() 
          .ToString() 
          .StartsWith(txtSearch.Text.Trim() 
          .ToLower() 
          .ToString()));