从VS服务参考查询OData Web服务

时间:2012-05-07 09:45:52

标签: visual-studio-2010 odata tridion tridion-content-delivery

我想发送这样的请求:

/odata.svc/Pages(ItemId=27,PublicationId=1)

这是我正在使用的代码:

CdService.ContentDeliveryService cdService = new ContentDeliveryService(new Uri("http://xxx.xx:81/odata.svc"));
var pages = cdService.Pages;
pages = pages.AddQueryOption("ItemId", "270");
pages = pages.AddQueryOption("PublicationId", "2");
var result = pages.Execute();

我的问题是这段代码发送的请求是这样的:

/odata.svc/Pages()?ItemId=270&PublicationId=2

这个请求的问题在于它返回了我所有的页面,而不仅仅是我需要的页面。

我可以使用LINQ:

result.Single(page => page.ItemId == 27 && page.PublicationId == 1);

但问题是所有页面仍将通过网络发送

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

EntityDescriptor entityDescriptor = service.Entities.Where(c => 
               c.Entity is CDService.Page 
               && ((CDService.Page)c.Entity).ItemId == pageId.ItemId 
               && ((CDService.Page)c.Entity).PublicationId == pageId.PublicationId)
            .FirstOrDefault();

if (entityDescriptor != null)
{
   return (CDService.Page)entityDescriptor.Entity;
}

答案 1 :(得分:1)

我找到了一个解决方案,虽然不是很好:

ContentDeliveryService cdService1 
                = new ContentDeliveryService(new Uri("http://xxx.xx:81/odata.svc"));
var page = cdService1.Execute<Page>(
             new Uri("http://xxx.xx:81/odata.svc/Pages(ItemId=27,PublicationId=1)"));

答案 2 :(得分:1)

我已经使用LINQ进行了快速测试,似乎正在进行正确的查询:

ContentDeliveryService.ContentDeliveryService service = 
    new ContentDeliveryService.ContentDeliveryService(new Uri("http://localhost:99/odata.svc"));
var page = from x in service.Pages
            where x.ItemId == 2122
                    && x.PublicationId == 16
            select x;
foreach (var page1 in page)
{
    Console.WriteLine(page1.Title);
}
Console.Read();