2010-02-04 11 views
11

Tengo problemas para obtener datos usando LINQ-to-SQL. Yo uso el siguiente fragmento de código para buscar un usuario de nuestra aplicación web (nombre de usuario es la dirección de correo electrónico):¿Cómo ignorar caso con LINQ-to-SQL?

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

Si escribo [email protected] consigo un ReferenceUser sin embargo si escribo [email protected] no lo hago. ¿Cómo puedo hacer que LINQ ignore el caso al seleccionar un usuario?

+0

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

+1

mañana? Son las 4pm donde estoy. – Oded

+0

¿Qué hay de permitir la insensibilidad de mayúsculas y minúsculas para esa columna en la base de datos? Desafortunadamente todavía vivimos en tiempos donde tal ajuste fino es necesario. La base de datos debe saber si una columna no distingue entre mayúsculas y minúsculas o no cuando habilita la indexación. – herzmeister

Respuesta

15

Hace:

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

trabajo?

El ToUpper() se debe traducir al SQL correcto para ejecutarlo como una consulta de base de datos, y luego devolver ambos resultados.

+0

Eso es lo que haría si no supiera que hay un indicador de caso de ignorar, pero +1 para la idea. –

+1

@David: cómo se comparan los asuntos en LINQ ya que la expresión lambda enviada a SingleOrDefault se traduce. De esta manera, seguramente se traducirá a SQL. – codekaizen

+0

Funciona bien. Sin embargo, para otras cadenas de comparaciones que no están en lambdas, ¿debería seguir con ToLower() o debería usar StringComparison.OrdinalIgnoreCase? –

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

Cuando el "verdadero" es si hay que omitir caso o no

+0

Solo como punto de consideración, no creo que esto se ejecute en el servidor, sin embargo. Recuerdo usar este patrón y no hacer que la consulta se interpretara correctamente. – codekaizen

+5

Aparentemente, por la forma en que se vota esta respuesta, los lectores de SO se sienten cómodos con los modismos de .Net, pero no tanto con LINQ en IQueryable. – codekaizen

0

Esta es la forma en que lo hice. Podría darte una pista. Tengo una lista con perfiles y quiero buscar nombres de perfil que contengan "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())); 
Cuestiones relacionadas