Dynamics CRM OData查询筛选仅在没有结果时对扩展属性有效?

Dynamics CRM OData查询筛选仅在没有结果时对扩展属性有效?,odata,dynamics-crm,dynamics-crm-2013,Odata,Dynamics Crm,Dynamics Crm 2013,我需要获取符合以下要求的价目表项目记录: 按特定的价格表筛选 按特定货币过滤 按包含给定字符串的相关产品的名称进行筛选 我得到了前两点,没问题,但感觉扩展不能很好地处理过滤。我从对产品实体的“直接”查询开始: .../ProductSet?$filter=substringof('sometext', Name) Equivalent SQL (targeting the corresponding CRM filtered views for clarity): SELECT * FROM

我需要获取符合以下要求的
价目表项目
记录:

  • 按特定的价格表筛选
  • 按特定货币过滤
  • 按包含给定字符串的相关
    产品的
    名称
    进行筛选
  • 我得到了前两点,没问题,但感觉扩展不能很好地处理过滤。我从对
    产品
    实体的“直接”查询开始:

    .../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\u price\u 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
      没有匹配项,它工作正常并返回空结果集
    • 如果
      $filter
      与某个内容匹配,我会得到一个错误
    代码:-2147220970

    消息:“Join”操作的结果选择器必须返回两个属性的匿名类型

    好吧,如果您在一次对多个实体使用
    .Where()
    时遇到LINQ to CRM的限制,就会发生这种情况。。。似乎不相关

    我的问题出了什么问题

    注意:我使用的CRM 2013是内部部署的,没有任何更新汇总/服务包


    另请注意:正如所料,等效的SQL可以完美地工作

    我认为CRM OData不支持在连接的实体上添加过滤器。尝试反转实际开始的实体,并向引用实体添加路径:

    ProductSet()?$filter=substringof('sometext',ProductNumber)&$expand=product_price_levels&$select=product_price_levels/*
    
    另外,如果您有linqPad,这是我用来生成的查询:

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

    您能否编写您试图在odata中执行的等效SQL语句?我有点搞不清楚您是如何尝试应用过滤器的,而SQL语句的可读性要高得多