对扩展属性的Dynamics CRM OData查询过滤仅在没有结果的情况下才有效?

时间:2014-09-11 10:47:56

标签: odata dynamics-crm dynamics-crm-2013

我需要提取符合以下要求的Price List Item条记录:

  1. 按特定的PriceList过滤
  2. 按特定货币过滤
  3. 按照包含给定字符串
  4. 的相关Name的{​​{1}}进行过滤

    我得到的前两点没有问题,但感觉扩展并不能很好地应对过滤。我从一个"直接"查询Product实体:

    Product

    以上查询有效,我可以调整它并且没有问题。但是,如果我尝试转到.../ProductSet?$filter=substringof('sometext', Name) Equivalent SQL (targeting the corresponding CRM filtered views for clarity): SELECT * FROM FilteredProduct WHERE ProductNumber LIKE '%sometext%' (从而扩展与ProductPriceLevel的关系,即Product),我最终会这样做:

    product_price_levels

    我看到了两种不同的结果:

    • 如果.../ProductPriceLevelSet?$expand=product_price_levels&$filter=substringof('sometext', product_price_levels/Name) Equivalent SQL (again, targeting the relevant filtered views): SELECT * FROM FilteredProductPriceLevel PPL JOIN FilteredProduct P ON PPL.ProductId = P.ProductId WHERE P.ProductNumber LIKE '%sometext%' 没有匹配项,则可以正常工作并返回空结果集
    • 如果$filter符合某些内容,我会收到错误
      

    代码:-2147220970

         

    消息:'加入'的结果选择器操作必须返回两个属性的匿名类型。

    AFAIK,当你遇到LINQ-to-CRM关于同时在多个实体上使用$filter的限制时会发生什么......看起来并不相关!

    我的查询有什么问题?

    注意:我使用的CRM 2013是.Where(),没有任何更新汇总/服务包。

    另请注意:可以预期的等效SQL可以很好地运行

1 个答案:

答案 0 :(得分:2)

我不认为CRM OData支持在已加入的实体上添加过滤器。尝试撤消您实际开始使用的实体,并添加引用实体的路径:

ProductSet()?$filter=substringof('sometext',ProductNumber)&$expand=product_price_levels&$select=product_price_levels/*

P.S。如果你有linqPad,这是我用来生成这个的查询:

from p in ProductSet
where p.ProductNumber.Contains("sometext")
select new { p.product_price_levels }