2010-08-02 13 views
6

que estoy tratando de hacer a mi servicio OData:Colección existe Criteria en WCF Data Services

"Dame todos los productos que no tienen una categoría"

con los productos y Categoría tener una relación M2M .

que he probado:

from p in Products 
where p.Categories == null 
select p 

y

from p in Products 
where !p.Categories.Any() 
select p 

y

from p in Products 
where p.Categories.Count == 0 
select p 

pero todos ellos me dan excepciones que no son compatibles.


No estoy buscando alternativas u opciones. Por favor, no respondas con otras opciones.

Respuesta

2

Esto no es compatible:

http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/b505d630-c808-4bde-b08e-3ce1dd17f621/

El lenguaje de consulta URL OData Actualmente no es compatible con este tipo de consulta. Como un resultado, el procesador LINQ del cliente tampoco lo admite. Si piensa que es valioso agregar dicha funcionalidad , utilice nuestro sitio connect para sugerir la función, hace que nuestro trabajo de planificación sea más fácil la próxima vez around. https://connect.microsoft.com/dataplatform/content/content.aspx?ContentID=15540&wa=wsignin1.0

Como solución temporal, probablemente podría utilizar el servicio operación. Defina una operación de servicio que devuelve IQueryable (así que puede componer algunos operadores más de consulta en el resultado del cliente ) y utilice el proveedor del lado del servidor para emitir la consulta anterior.

2

Mi experiencia con los servicios de datos WCF es que falta el subconjunto de clientes de LINQ para descansar.

Mi opción sesgada sería simplemente moverlo al lado del servidor donde tiene acceso a la implementación completa de LINQ para las entidades. (o lo que sea que esté utilizando para implementar su servicio de datos).

[WebGet] 
public IQueryable<Products> GetProductsWithoutCategories(){ 
    /*start psudo code 
     from p in Products 
     where p.Categories.Count == 0 
     select p 


    */ 

} 
+0

El cliente de hecho no es compatible con este tipo de consulta, porque el lenguaje de consulta URL no lo admite. La solución con una operación de servicio como la publicada arriba es buena. –

0

Mi solución a este problema fue la de $ ampliar el campo relacionado en la consulta, y luego probar si ese campo estaba vacío o no ...

JArray _array = (JArray)main_table_object["some_related_field"]; 

    if (_array.Count > 0) 
     continue; 

.. esto es en el contexto de consultas desde el teléfono con Windows 7 a un servicio WCF utilizando JSON como formato de mensaje.

Cuestiones relacionadas