2012-08-10 67 views
1

我第一次檢出WCF數據服務和OData,我想知道是否在實體模型中使用繼承是不好的做法?它似乎沒有得到很好的支持。WCF數據服務和OData中派生的實體類型

例如,我遇到了OData問題,我想在派生類型的屬性上進行篩選。但似乎只能過濾基類型屬性?

此失敗: HTTP:// [本地主機]:8080 /實體$濾波器= startswith(文字, 'BLA')

在任何情況下,是能夠更好地創建非衍生的實體類型和有接口的「協調」不同實體類型的屬性?

例如:

EntityBase - >標識,的ParentId

筆記本:EntityBase - >標題

注:EntityBase - >文本

IEntity - >標識,ParentId

筆記本:IEntity - > ID,的ParentId,標題

注:IEntity - >標識,的ParentId,文字


爲什麼還在不在5.1.0-RC1支持的格式$標籤?

回答

2

$格式即將支持。部分原因是因爲意識形態的原因,並且因爲存在簡單的解決方法,所以這個問題的優先級較低。在此之前,你可以使用Pablo已經博客寫的JSONP attribute。無論如何,在接下來的幾個月中,您應該可以在我們的堆棧中看到$格式的URL格式。

至於派生類型,大多數操作應該工作正常,以我所知。要過濾派生類型的屬性,您需要首先轉換爲該類型。舉例來說,在我的劃痕服務,我有以下類別:

namespace Scratch.Web 
{ 
    public abstract class Product 
    { 
     public int ID { get; set; } 
     public string Name { get; set; } 
     public Product RelatedProduct { get; set; } 
    } 

    public class DiscountedProduct : Product 
    { 
     public double Discount { get; set; } 
     public ICollection<Category> Categories { get; set; } 
    } 

    // ... 
} 

這使我能夠發出查詢,如下面的(這將讓我所有的打折產品具有大於10的折扣):

http://localhost:59803/ScratchService.svc/Products/Scratch.Web.DiscountedProduct?$filter=Discount gt 10.0 

在URL中,注意轉換爲我要過濾的類型(使用完全限定的實體類型名稱)。

+0

我也注意到LightSwitch似乎不支持域模型中的繼承,所以我不會推薦任何人在他們的模型中使用繼承:http://connect.microsoft.com/VisualStudio/feedback/details/749933/wcf-data-service-odata – 2012-08-11 10:47:01

+0

如果你的客戶端是LightSwitch,那可能是真的。如果你的客戶端將是WCF數據服務,或data.js,或ODataLib,或簡單的JavaScript,我認爲你會很好地使用繼承。 – 2012-08-11 16:06:53

+0

爲了在Data Services中使用繼承,我必須升級到最新版本的庫。我使用的是客戶端庫的5.4版(NuGet),我可以確認繼承可以與該版本兼容。 – 2013-05-02 14:12:47