6

我正在尝试加入 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 to OData 文章似乎表明 Linq to OData 不支持连接(这里

4

2 回答 2

6

据我所知,针对数据服务 (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 构建了过滤器类型查询。

希望这可以帮助。

于 2012-11-14T23:20:25.293 回答
1

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

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

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

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

于 2012-12-19T14:04:02.237 回答