2010-02-04 16 views
11

Ho problemi con il recupero dei dati tramite LINQ-to-SQL. Io uso il seguente pezzo di codice per cercare un utente per il nostro web app (nome utente è l'indirizzo e-mail):Come ignorare il caso con LINQ-to-SQL?

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

Se scriv [email protected] ho un ReferenceUser se digito [email protected] non lo faccio. Come posso far sì che LINQ ignori il caso quando si seleziona un utente?

+0

Date un'occhiata a http://stackoverflow.com/questions/841226/case-insensitive-string-compare-in-linq-to-sql –

+1

mattina? Sono le 16:00 dove sono. – Oded

+0

Come attivare l'insensibilità alle maiuscole/minuscole per quella colonna nel database? Purtroppo viviamo ancora in tempi in cui è necessaria una messa a punto così precisa. Il database deve sapere se una colonna non fa distinzione tra maiuscole e minuscole quando abilita l'indicizzazione per esso. – herzmeister

risposta

15

Does:

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

lavoro?

Il ToUpper() deve essere convertito nell'SQL corretto da eseguire come query di database e quindi restituire entrambi i risultati.

+0

Questo è quello che farei se non sapessi che c'era una flag di maiuscolo, ma +1 per idea. –

+1

@David: come si confrontano gli argomenti in LINQ poiché l'espressione lambda inviata a SingleOrDefault viene tradotta. In questo modo sarà sicuramente tradotto in SQL. – codekaizen

+0

Funziona bene. Tuttavia per altri confronti di stringhe che non sono in lambda dovrei rimanere con ToLower() o dovrei usare StringComparison.OrdinalIgnoreCase ?? –

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

Dove il "vero" è se ignorare caso o no

+0

Solo come punto di considerazione, non penso che questo sarebbe eseguito sul server, però. Ricordo di aver usato questo modello e non di aver interpretato correttamente la query. – codekaizen

+5

Apparentemente dal modo in cui questa risposta viene votata, il pubblico SO è abbastanza a suo agio con gli idiomi .Net, ma meno con LINQ su IQueryable. – codekaizen

0

Questo è quanto ho fatto. Potresti darti un suggerimento. Ho una lista con profili e voglio cercare i nomi dei file contenenti "aR", "Ar" o "AR".

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())); 
Problemi correlati