我正在使用最新的 ASP.Net WebAPI Nightly 版本(日期为 2013-01-16)。
目前我有一个简单的 EF 数据库第一个模型,它有两个实体 - 患者和访问。每个患者可以多次就诊。
我希望能够查询我的患者列表,并内联返回每个患者的访问实体。我知道 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 被修改(我很乐意尝试)以将此额外信息嵌入到适当的位置(在每个导航链接中作为嵌套的内联提要,尽我所能)然后我会被设置。
问题:
非常感谢!
最佳答案
$expand 在我们支持 OData 的东西列表中非常重要。但据我所知,我们没有任何标志可以在服务器端开启它。格式化程序目前也不允许您替换自己的序列化程序。因此,恐怕您在此期间唯一的选择是创建一个分支并添加对 $expand 的支持。如果您设法让它工作,请考虑以我们的方式发送拉取请求:
http://aspnetwebstack.codeplex.com/SourceControl/network
关于asp.net-web-api - 在 ASP.NET Web API OData 中返回子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14392402/