Cómo crear una expresión dinámica 'de contenido o LIKE' para usar con Linq contra el servicio OData

c# expression-trees linq odata

Pregunta

Estoy intentando crear una herramienta de consulta dinámica usando System.Linq.Expressions.Expression (WPF / c # 4.0) Se ejecuta contra un servicio OData.

Hasta ahora, todo está funcionando siempre que limite las condiciones para construir opciones como Equal (..), GreaterThan (..), etc. Parece que no hay ningún build en la condición de Like / Like, así que intenté crear el mío. Hay un puñado de artículos ya por ahí. Uno que probé es ¿Cómo crear un System.Linq.Expressions.Expression para Like? .

Ahora, si uso la solución anterior, el resultado es donde la expresión es

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => MyLike(clt.LastName, "te"))}'

lo cual es bueno, pero incorrecto, ya que no se traduce en una consulta de Odata válida.

Si uso la condición 'Igual', el resultado es

whereCallExpression = {Convert([10000]).Expand("A,B").Where(clt => (clt.LastName == "te"))}

lo que resulta en la consulta OData

results = {http://.../Clients()?$filter=LastName eq 'te'&$expand=A,B} 

y está funcionando como se esperaba.

¿Estoy haciendo algo mal con la implementación de la solución o no se puede utilizar con OData?

Debería transferirse a algo como ...?$filter=substringof('te', LastName ) eq true

¿Alguna solución sobre cómo solucionar esto?

Saludos

Andreas

PS, implementé la extensión de la solución en una clase estática, todo lo que cambié es el nombre del método llamado "Me gusta" a "MyLike" También, ya que el código utilizado para construir las expresiones funciona con cualquiera de las condiciones integradas Supongo que por ahora esa parte está bien. Puedo publicar partes de él si es necesario

Respuesta aceptada

OData actualmente no admite el operador "me gusta" en absoluto. Así que no importa lo que haga en el cliente, la URL producida no tiene forma de expresar eso. La subcadena es compatible y el proveedor LINQ del cliente debe generarla cuando use la cadena. Contiene el método en la expresión de su filtro (Dónde).

Para obtener la expresión generada por un compilador de C #, puedes hacer algo como esto:

IQueryable<string> source = new List<string>().AsQueryable();
IQueryable<string> result = from item in source where item.Contains("John") select item;
Console.WriteLine(result.Expression.ToString());

Básicamente, cualquier IQueryable tiene una propiedad Expresión que contiene el árbol de expresiones para que se ejecute la consulta. Algunos proveedores de LINQ pueden cambiar el árbol de expresiones en cierta medida del original creado por el compilador, pero la mayoría debería dejarlo cerca del original.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow