WCF 数据服务 (OData) - 使用外键扩展导航属性

发布于 2024-12-13 12:31:15 字数 889 浏览 0 评论 0原文

我目前正在编写一个基于 WCF Dataservices Toolkit 的 OData 服务。

该服务公开了多个对象,下面列出了其中的一个示例。

public class Entitlement : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemId { get; set; }

    [ForeignProperty]
    public Item Item { get; set; }
}

public class Item : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemName { get; set; }  
}

由于数据是从 2 个独立的数据源检索的,我只想将 Item 的 Id 存储在 Entitlement 对象中,而不是整个 Item 对象。

这适用于诸如:Entitlement('1')/Item 之类的查询,服务了解它需要使用 ItemId 来执行查找。

但是,当我尝试使用以下 URL 扩展项目时,就会出现问题 Entitlement('1')?$expand=Item

Item 总是返回为 null,我知道这是因为我没有将 Item 存储在权利对象上,但无论如何我可以强制 OData 处理 Expand 语句与处理投影的方式相同吗?

我已经尝试过 Entitlement('1')?$select=Item 但这也返回为 null。

任何建议将不胜感激。

I am currently writing an OData service that is based on the WCF Dataservices Toolkit.

There are several objects that are exposed by the service an example of which is listed below.

public class Entitlement : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemId { get; set; }

    [ForeignProperty]
    public Item Item { get; set; }
}

public class Item : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemName { get; set; }  
}

Due to the data being retrieved from 2 separate data sources I only want to store the Id of the Item in the Entitlement object rather than the whole Item object.

This works for queries such as: Entitlement('1')/Item, the service understands that it needs to use the ItemId to perform the lookup.

However the problem occurs when I try and expand the Item using the below URL
Entitlement('1')?$expand=Item

The Item always comes back as null, I understand that this is because I am not storing the Item on the entitlement object, but is there anyway that I can force OData to treat the expand statement the same way it treats the projection?

I have tried Entitlement('1')?$select=Item but this also comes back as null.

Any suggestions would be greatly appreciated.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱的十字路口 2024-12-20 12:31:15

要扩展导航属性(集合)引用的对象,我认为您需要在 URI 中使用 $links 语法。

请参阅OData 协议 URI 约定文档中的第 3.2 节“处理实体之间的链接”

To expand the objects referenced by a navigation property (collection), I think you need to use the $links syntax in the URI.

See Section 3.2"Addressing Links Between Entities" in the OData Protocol URI Conventions doc.

落在眉间の轻吻 2024-12-20 12:31:15

为了能够使用 $expand,您的模块必须在链接属性上具有虚拟关键字

public class Entitlement : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemId { get; set; }

    public virtual Item Item { get; set; }
}

这将允许您使用 oData 查询选项 $expand

Entitlement('1')?$expand=Item

To be able to use the $expand your module must have the virtual keyword on your linked property

public class Entitlement : IEntity
{
    #region Implementation of IEntity
    public string Id { get; set; }
    #endregion

    public string ItemId { get; set; }

    public virtual Item Item { get; set; }
}

This will allow you to use the oData query option $expand

Entitlement('1')?$expand=Item

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文