【问题标题】:"the method join is not supported" with Tridion OData service & LinqTridion OData 服务和 Linq 的“方法加入不受支持”
【发布时间】:2012-11-03 11:46:48
【问题描述】:

我正在尝试加入 CustomMeta 和 PageContents 以通过一些已设置的元数据选择特定页面,但我收到“不支持方法加入”错误。我认为问题出在我的 linq 语句上,因为错误发生在任何东西被发送到 OData 服务之前。但究竟是什么问题? linq 语句对我来说看起来不错:

    var pages2 = (from p in cds.PageContents
    join m in cds.CustomMetas on p.PageId equals m.ItemId
    where m.ItemType==64 && m.KeyName=="SomeKey" && m.StringValue=="SomeValue"
    select p).ToList<SDLODataClient.SDLOData.PageContent>();

更新 1

这个Tridion OData article 有一个连接示例,但我正在阅读的一些 MS Linq to OData 文章似乎表明 Linq to OData 不支持连接 (here)

【问题讨论】:

    标签: linq tridion tridion-2011 tridion-content-delivery


    【解决方案1】:

    据我所知,针对数据服务 (OData) 的 LINQ 查询不支持多种方法。您正在使用的 join 也属于同一类别,因此即使从 LINQ 的角度来看语法非常有效,您也会看到错误。 join 属于“投影和过滤运算符”,不支持使用 LINQ 对 OData 进行查询。

    这里是解释所有不支持的方法的链接(请参阅部分 - 不支持的 LINQ 方法)

    http://msdn.microsoft.com/en-us/library/ee622463(v=vs.100).aspx

    回到你的问题,我不太清楚如何实现你正在寻找的东西,但我会尝试以下方法(你可能必须在多次迭代中得到结果):

    • 获取与自定义元查询匹配的页面 ID 列表(示例 sn-p - 未测试)
    _client.CustomMetas.Where (
     m => m.KeyName == "somekey" && m.StringValue == "somevalue" && m.ItemType == 64)
    .ToList();
    
    • 现在您可以使用上述页面 ID 查询页面内容。您可能已经为每个页面 ID 构建了过滤器类型查询。

    希望这会有所帮助。

    【讨论】:

    • 我链接的一篇文章显示了一个带有连接的 Tridion OData 示例,这让我很震惊。这显然需要在 2 个查询中完成。谢谢。
    【解决方案2】:

    您是否尝试过使用 expand 的概念?

    在OData服务中我们没有join查询,但是有Expand关键字,其中两个具有外键关系的实体(表)可以一起使用得到一个结果集。它的工作原理如下:

    from item in table1.Expand(table2).AsEnumerable()
    where (item.property1.Equals("x") & item.table2[0].prop2.Equals("y"))
    select item
    

    这里第二个实体作为第一个实体的属性公开。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 2019-11-26
      • 2012-10-18
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多