asp.net-web-api - 在 ASP.NET Web API OData 中返回子元素

标签 asp.net-web-api odata

我正在使用最新的 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 被修改(我很乐意尝试)以将此额外信息嵌入到适当的位置(在每个导航链接中作为嵌套的内联提要,尽我所能)然后我会被设置。

问题:
  • 我是否忽略了一些明显的东西,并且我可以设置一个标志来开启这种行为?我可以理解为什么,如果存在这样的标志,默认情况下它会关闭(EF 延迟加载并且此标志不会很好)
  • 如果#1 不是,是否还有其他一些我可以使用的 ODataEntityTypeSerializer?如果是这样,我该如何切换到它?
  • 如果#2 不是,我应该从哪里开始写我自己的任何指示?有没有我可以在我自己的序列化程序中替换的地方,或者我是否必须维护自己的 ASP.NET 扩展项目(与运行时项目相对)

  • 非常感谢!

    最佳答案

    $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/

    相关文章:

    c# - 从 OWIN 中的 OAuth Bearer Token 获取 IPrincipal

    odata - Olingo 贪心 $expand

    c# - Asp.Net Web API ODATA 的 GROUP BY/不区分大小写扩展?

    stored-procedures - 如何在 Teiid OData 中公开存储过程

    c# - 展开 WCF 数据服务 (OData) 的投影(选择)

    asp.net-mvc - 为什么这两个 API 方法会产生冲突

    asp.net-web-api - 找不到Web API : System.Net.Http版本2.0.0.0

    angularjs - 在angularjs中填充动态控件

    c# - MVC Web API post 方法接收到 MailMessage 对象为空

    c# - webApi2 Odata v3 和 V4 并排