2011-11-02 86 views
1

我目前正在編寫基於WCF Dataservices Toolkit的OData服務。WCF數據服務(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個獨立的數據源檢索的數據I只想的項的ID存儲在權利對象,而不是整個Item對象。

這適用於諸如:Entitlement('1')/ Item之類的查詢,服務理解它需要使用ItemId來執行查找。

然而,當我嘗試使用下面的URL 權利(「1」)展開項目?$擴張出現問題=項目

項目總回來爲空,我明白,這是因爲我我沒有在權利對象上存儲Item,但是無論如何,我可以強制OData以對待投影的方式來對待擴展語句?

我試過Entitlement('1')?$ select = Item,但是這也會返回爲null。

任何建議將不勝感激。

回答

0

要擴展由導航屬性(集合)引用的對象,我認爲您需要在URI中使用$ links語法。

請參閱Section 3.2"Addressing Links Between Entities" in the OData Protocol URI Conventions doc

+0

嗨@dthorpe問題實際上在於我們沒有使用SQL和實體框架。由於數據必須在運行時解決,因此我們需要攔截入站請求並手動獲取額外數據。或者我們需要重寫表達式樹並手動添加展開包裝,以便它將被我們的自定義提供程序拾取。 – SCB

0

爲了能夠使用$擴展模塊必須具有虛擬關鍵字對您關聯屬性

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的查詢選項$擴大

權利(「1 ')?$ expand = Item

+0

是的,我們經歷了整個規範,不幸的是沒有使用支持跨集合/表加入的關係提供者。我一直有意發佈我們當時使用的解決方法/修復。 – SCB