Tridion OData服务& amp;“不支持方法连接”。 LINQ

时间:2012-11-14 21:52:48

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

我正在尝试加入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到OData(here)不支持连接

2 个答案:

答案 0 :(得分:6)

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

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

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

回到你的问题,我不太了解你正在寻找什么,但我会尝试以下(你可能必须在多次迭代中得到结果):

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

希望这有帮助。

答案 1 :(得分:1)

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

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

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

此处,第二个实体作为第一个实体的属性公开。