Filtrado OData Case In-Sensitive en Web API?

Por defecto, ODataController realiza búsquedas sensibles a mayúsculas y minúsculas. ¿Cómo podemos extender este comportamiento para realizar búsquedas insensibles a mayúsculas y minúsculas?

public class NammaODataController : ODataController { [EnableQuery] public IQueryable<FD> GetFD(ODataQueryOptions qo) { return _ctx.FDs.AsQueryAble(); //EF takes care to apply odata query operators internally //after control passes from action } } 

Me referí a este SO, parece que podemos aprovechar Expression Tree, pero ¿en qué punto de extensibilidad?

¿Hay alguna manera de que pueda interceptar la consulta y personalizar EF / Web Api piplelie para lograr esto?

Aquí hay un ejemplo: / FD? $ Filter = tolower (Pr_Name) eq tolower ('TAMARA') – esto debería devolver a todas las personas con el nombre 'Tamara' (no distingue entre mayúsculas y minúsculas, podría ser 'TAMARA', 'tamara', 'Tamara', etc. Espero que esto ayude, para exponer mi punto.

EDITAR:

La senitivity en ODATA Web API queries no tiene nada que ver con SQL Collation. Esto ha sido un problema con el marco de Microsoft OData.


Con operador de subcadena

 void Main() { var lower = _ctx.FD .Where(sv => sv.Pr_Name.Contains("tamara")) .Take(1) .ToList(); Console.WriteLine("LOWER CASE AZURE SQL OUTPUT"); Console.WriteLine(lower); Console.WriteLine("UPPER CASE AZURE SQL OUTPUT"); var upper = _ctx.FD .Where(sv => sv.Pr_Name.Contains("TAMARA")) .Take(1) .ToList(); Console.WriteLine(upper); } 

enter image description here


Con operador eq

 void Main() { var lower = FD .Where(sv => sv.Pr_Name == tamara A TOPOLESKI") .Take(1) .ToList(); Console.WriteLine("LOWER CASE AZURE SQL OUTPUT"); Console.WriteLine(lower); Console.WriteLine("UPPER CASE AZURE SQL OUTPUT"); var upper = FD .Where(sv => sv.Pr_Name == "TAMARA TOPOLESKI") .Take(1) .ToList(); Console.WriteLine(upper); } 

enter image description here

Editar

Tiene razón, el problema no está relacionado con su intercalación. Tiene que ver con la expresión de odata que estás usando. En su consulta de testing actualizada está usando Contains que se traduce a LIKE con comodines ( cualquier cadena de cero o más caracteres ) en cualquier extremo del valor de búsqueda. Sin embargo, en su expresión de odata está utilizando eq que se traducirá en a = en la expresión EF y luego nuevamente en la consulta SQL. Como los valores de Pr_Name que ha mostrado en su salida no son exactamente iguales a "Tamara" pero contienen "Tamara" las consultas de odata no devolverán ningún dato.

Lo que necesita es la substringof expresión del filter de odata que sería traducida por EF a Contains que se traduce en sql a LIKE con comodines a cada lado del valor de búsqueda.

 /FD?$filter=substringof(Pr_Name,'tamara') 

Para get más expresiones de filter, consulte Uso de expresiones de filter


Como @ThomasKoelle declaró en los comentarios, esto tiene que ver con la compilation de la (s) columna (s). La interconnection OData ( definida anteriormente ) utiliza Entity Framework, que convierte la expresión pasada en una consulta para la database. Entonces, la expresión OData no tiene nada que ver con eso y tampoco la consulta EF construida.

Si tiene una intercalación sensible a mayúsculas y minúsculas, deberá hacer todos los términos de búsqueda y columnas de búsqueda en el mismo caso, lo que es muy malo para el performance porque esas cláusulas de búsqueda no serían SARGables.

Para la mayoría de los DBMS, la recostackción de la columna se henetworkinga de la intercalación pnetworkingeterminada de la database que se henetworkinga de la intercalación pnetworkingeterminada de las instancias. Puede anular en cada nivel, pero debe hacerlo explícitamente en el momento en que se definan las instancias (esquema / database).

    Intereting Posts