2011-03-15 13 views
37
public Articles GetByName(string name, Categories category, Companies company) 
{ 
    var query = from article in session.Linq<Articles>() 
       where article.Name == name && 
         article.Category == category && 
         article.Company == company 
       select article; 
    return query.FirstOrDefault(); 
} 

cómo puede la consulta ser insensible a mayúsculas y minúsculas. Puedo usar toLower o toUpper pero quiero con OrdinalIgnoreCase. ¿Es posible?linq case insensitive (sin toUpper or toLower)

+0

Posible duplicado de [LINQ contiene mayúsculas y minúsculas] (http://stackoverflow.com/questions/3360772/linq-contains-case-i nsensitive) –

Respuesta

58

Uso String.Equals con los parámetros adecuados para que sea sensible a mayúsculas

mySource.Where(s => String.Equals(s, "Foo", StringComparison.CurrentCultureIgnoreCase)); 
+0

hmm ahora recibo el valor no puede ser nulo. Nombre del parámetro: left – senzacionale

+0

¿Estás seguro? 'String.Equals' debería ser capaz de aceptar null como parámetro. –

+0

sí, me sale un error aquí query.FirstOrDefault(); – senzacionale

4

Uso

String.Equals(article.Name, name, StringComparison.OrdinalIgnoreCase) 
+0

Huh - nunca usó 'OrdinalIgnoreCase' antes - ¿cuál es la diferencia entre eso y' CurrentCultureIgnoreCase'? –

+0

@Adam Racks: RTFM;) Básicamente, su solución tiene en cuenta las reglas de comparación de la cultura actual, mientras que la mía hace una comparación simple byte por bytes después de hacer ambas cadenas en mayúsculas. Una búsqueda de Google o SO traerá mucha información sobre ese tema. –

+0

+1 por decirme a RTFM :) - Me hubiera ido con "JFGI" .... –

29

En cambio, si == utilizar el método .Equals(name, StringComparison.OrdinalIgnoreCase).

var query = from article in session.Linq<Articles>() 
      where article.Name.Equals(name, StringComparison.OrdinalIgnoreCase) && 
        article.Category.Equals(category) && 
        article.Company.Equals(company) 
      select article; 

return query.FirstOrDefault(); 
+7

Tenga cuidado con String.Equals() y StringComparison en combinación con LINQ. Dependiendo del sistema de la base de datos, la opción podría ser ignorada. P.ej. SQLite u Oracle. – StefanG

6
var query = from article in session.Linq<Articles>() 
      where string.Equals(article.Name,name, StringComparison.OrdinalIgnoreCase) && 
       string.Equals(article.Category,category, StringComparison.OrdinalIgnoreCase) && 
       string.Equals(article.Company,company, StringComparison.OrdinalIgnoreCase) 
         select article; 

      return query.FirstOrDefault(); 

También se encargará, cuando el nombre, categoría de empresa es null

+0

Esta solución particular no es necesariamente compatible. Por ejemplo, usando Linq2SQL, en SQLServer2008: ' 'boolean equals (System.String, System.String, System.StringComparison)' método no tiene traducción apoyado a SQL.' parecida: ' 'boolean equals (System.String, System.StringComparison) 'no tiene traducción soportada a SQL.' – mcdrewski

+0

@mcdrewski En realidad obtengo 'Número incorrecto de argumentos suministrados para la llamada al método 'Boolean Equals (System.String, System.String, System.StringComparison) "Incluso cuando estoy _claramente_ brindando los argumentos esperados. Utilizo EF4, creo, probablemente un error. – drzaus

13

Si se trata de una consulta LINQ to SQL en una base de datos con una intercalación entre mayúsculas y minúsculas, de lo que ya es caso- insensible. Recuerde que LINQ to SQL no está ejecutando su llamada ==; lo está viendo como una expresión y convirtiéndolo en un operador de igualdad en SQL.

Si se trata de LINQ to Objects, puede utilizar String.Equals como los otros carteles han señalado.

0

cambiarlo a

public Articles GetByName(string name, Categories category, Companies company) 
     { 
    var query = from article in session.Linq<Articles>() 
          where string.Equals(article.Name, StringComparison.CurrentCultureIgnoreCase) == name && 
           string.Equals(article.Category, StringComparison.CurrentCultureIgnoreCase == category && 
           string.Equals(article.Company, StringComparison.CurrentCultureIgnoreCase == company 
          select article; 

       return query.FirstOrDefault(); 
} 
0

Use string.Equals (nombre, article.Name, StringComparison.OrdinalIgnoreCase) cuando que está seguro de que su base de datos lo soporta.

E.g. SQLite con un cotejo de NOCASE ignorará la opción. Oracle usa las configuraciones de sesión NLS_COMP, NLS_SORT que se tomarán.

De lo contrario, utilice ToLower() o ToUpper() cuando no tenga problemas de cultura.

1

Si está usando C# 6.0 se puede definir un método de extensión corta para ser utilizado en la construcción de las declaraciones de LINQ:

public static bool EqualsInsensitive(this string str, string value) => string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase); 

Uso:

query.Where(item => item.StringProperty.EqualsInsensitive(someStringValue)); 

para C# menor de 6,0 que se verá así esto:

public static bool EqualsInsensitive(this string str, string value) 
{ 
    return string.Equals(str, value, StringComparison.CurrentCultureIgnoreCase); 
}