在ASP.NET WebAPI OData中返回子元素

时间:2013-01-18 04:28:42

标签: asp.net-web-api odata

我正在使用最新的ASP.Net WebAPI Nightly版本(日期为2013-01-16)。

我现在有一个简单的EF数据库第一个模型,它有两个实体 - 患者和访问。每位患者都可以多次访问。

我希望能够查询我的患者列表,并让每位患者的访问实体在线返回。我知道WebAPI的OData实现还不支持$ expand。我希望这只意味着不支持可选的客户端控制扩展,并且我可以强制扩展服务器端。

目前我没有进行任何内联访问。

例如,我的PatientController的()Get()方法看起来像

[Queryable(AllowedQueryOptions=AllowedQueryOptions.Supported)]
public override IQueryable<Patient> Get()
{
    var query = this.entities.Patients.Include("Visits");
    return query;  
}

我已经验证了针对我的数据库执行的查询确实包含了访问信息。

要使用公开的OData服务作为示例,如果您使用http://services.odata.org/OData/OData.svc/处的服务,则可以获得供应商列表。这是http://http://services.odata.org/OData/OData.svc/Suppliers。 您还可以使用http://http://services.odata.org/OData/OData.svc/Suppliers?$expand=Products

索取包含产品列表的供应商列表

单步执行ASP.NET代码(通过符号服务器)我已经到了System.Web.Http.OData.Formatter.Serialization.ODataEntityTypeSerializer,可以看到它的CreatePropertyBag方法,它构建了属性列表要序列化,只是不包含导航属性,除了被写为NavigationLinks之外,它们似乎没有被枚举。

我对ASP.NET世界一般都很陌生,花了一周左右的时间了解事情的发展方向(尤其是2012年底对OData所做的更改以及到目前为止所做的进一步更改)在2013年)。

我怀疑如果要修改ODataEntityTypeSerializer(我很乐意尝试)将这些额外信息嵌入到适当的位置(在每个导航链接中作为嵌套的内联Feed,我能说的最好)然后我会设定。

问题:

  1. 我是否忽略了一些明显的东西,我可以设置一个标志来打开这种行为?我可以看到为什么,如果这样的标志存在,它将默认关闭(EF延迟加载,这个标志不会很好)

  2. 如果#1不是,我可以使用其他一些ODataEntityTypeSerializer吗?如果是这样,我该如何切换到它?

  3. 如果#2不是,那么我应该从哪里开始编写自己的指针?有没有我可以在自己的序列化程序中替换的地方,或者我必须维护自己的ASP.NET扩展项目的分支(而不是运行时项目)

  4. 非常感谢!

2 个答案:

答案 0 :(得分:3)

$ expand在我们支持OData的事物列表中非常高。但据我所知,我们没有任何标志可以在服务器端打开它。格式化程序当前不允许您替换自己的序列化程序。所以我担心你在此期间唯一的选择就是创建一个fork并添加对$ expand的支持。如果您设法让它工作,请考虑以我们的方式发送拉取请求:

http://aspnetwebstack.codeplex.com/SourceControl/network

答案 1 :(得分:1)

你可以在web api nightly build中试用它。

以下是如何使用nuget安装它: http://aspnetwebstack.codeplex.com/wikipage?title=Use%20Nightly%20Builds