2012-08-10 68 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