5

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

我目前有一个简单的 EF 数据库第一个模型,它有两个实体——Patients 和 Visits。每个病人可以有很多次就诊。

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

目前我没有得到任何内联访问。

例如,我的 PatientController's() 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(我很乐意尝试)以将这些额外信息嵌入到适当的位置(在每个导航链接中作为嵌套的内联提要,尽我所知),那么我将被设置。

问题:

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

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

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

非常感谢!

4

2 回答 2

3

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

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

于 2013-01-18T06:09:36.467 回答
1

您可以在 webapi nightly builds 中尝试它。

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

于 2013-05-01T07:51:16.117 回答