WCF 数据服务中的集合存在条件

Posted

技术标签:

【中文标题】WCF 数据服务中的集合存在条件【英文标题】:Collection Exists Criteria in WCF Data Services 【发布时间】:2011-03-24 09:01:29 【问题描述】:

我正在尝试询问我的 OData 服务:

“给我所有没有类别的产品”

与Products和Category有m2m关系。

我试过了:

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

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

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

但所有这些都给了我不受支持的例外情况。


我不是在寻找替代方案或选项。请不要用其他选项回答。

【问题讨论】:

【参考方案1】:

我使用 WCF 数据服务的经验是缺少 LINQ to rest 的客户端子集。

我有偏见的选择是将其移动到服务器端,在那里您可以访问 LINQ to entites 的完整实现? (或您用来实现数据服务的任何东西)。

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


    */

 

【讨论】:

客户端确实不支持这种查询,因为URL查询语言不支持。不过,上面发布的带有服务操作的解决方案是一个不错的解决方案。【参考方案2】:

不支持:

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

当前的 OData URL 查询语言 不支持这种类型的查询。作为 结果客户端的 LINQ 处理器 也不支持。如果你 认为添加这样的东西很有价值 功能请使用我们的连接 建议该功能的网站,它使 下次我们的计划工作更容易 大约。 https://connect.microsoft.com/dataplatform/content/content.aspx?ContentID=15540&wa=wsignin1.0

作为一种解决方法,您可能可以使用 服务运营。定义服务 返回 IQueryable 的操作(所以 您可以编写更多查询 结果的运算符 客户端)并使用服务器端 提供者发出上述查询。

【讨论】:

【参考方案3】:

我对这个问题的解决方法是$expand查询中的相关字段,然后测试该字段是否为空...

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

   if (_array.Count > 0) 
      continue; 

.. 这是在从 Windows 7 手机到使用 JSON 作为消息格式的 WCF 服务的查询的上下文中。

【讨论】:

以上是关于WCF 数据服务中的集合存在条件的主要内容,如果未能解决你的问题,请参考以下文章

使用稍微复杂的方法引用 WCF 服务时获取“递归集合数据契约”

向 WCF 发送集合时,远程服务器返回错误:NotFound

添加服务引用时出错:类型是不支持的递归集合数据协定

WCF 服务的多个 HTTPS 终结点

哪种列表/集合类型最适合在 WCF 数据协定中使用?

尝试将 WCF 应用程序上传到服务器时出错