"the method join is not supported" 与 Tridion OData Service & Linq



我正在尝试加入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的这篇文章有一个连接的例子,但我正在阅读的一些MS Linq到OData的文章似乎表明,Linq到OData(此处)不支持连接

据我所知,针对数据服务(OData)的LINQ查询不支持几种方法。您正在使用的join也属于同一类别,因此即使从LINQ的角度来看语法非常有效,您也会看到错误。join属于"投影和筛选运算符",不支持使用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构建了过滤器类型查询

希望这能有所帮助。

您尝试过使用扩展的概念吗?

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

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

这里,第二实体被公开为第一实体的属性。

最新更新