1

我有一个由两个实体组成的简单数据模型

public class product 
{
     public int ID {get;set;}
     public string Name {get;set;}
}

public class supplier
{
    public int ID {get;set;}
    public string Name {get;set;}
    public IEnumerable<product> products {get;set;}
}

现在,我想从我的 WebApi odata 控制器返回供应商及其所有产品。但我似乎无法让这个工作,它只是返回供应商并有效地剥离产品信息。控制器方法是一个简单的 Get 和 GetEntityByKey。我的配置如下。

 ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
            modelBuilder.EntitySet<supplier>("supplier");
            modelBuilder.EntitySet<product>("product");

我是否缺少配置选项来使其正常工作?

4

3 回答 3

1

你没有提到你用来获取供应商实体的 URI,但我假设它看起来像:http://.../ServiceRoot.svc/supplier(1)。默认情况下,在 OData 中,导航属性不展开;也就是说,默认情况下,请求供应商不会包括链接产品的 ID 和名称,除非您通过$expand查询选项明确要求它们。例如:http://.../ServiceRoot.svc/supplier(1)?$expand=products

如果您不展开导航属性,则products供应商的属性将显示为产品实体的链接集合。如果您在响应负载中没有看到指向产品的链接,可能是因为您使用的是 OData 的新 v3 JSON 格式,它可能会省略遵循一般 OData URI 约定的导航链接(因为客户端可以生成那些链接本身)。

如果您包含请求 URI 和返回的有效负载,我可以更清楚地了解您的情况。

关于术语的快速说明:OData 中的“复杂类型”通常是指没有标识的结构类型。一个典型的例子是 Address 类型,它是一个具有多个组件(城市、国家、街道等)但不需要有自己的键的值类型。您在这里谈论的是实体之间的导航。

于 2013-05-31T00:08:39.603 回答
0

也许尝试使用 QueryableAttribute。看这里:

扩大支持

2) 通过 QueryableAttribute 支持对单个实体的 $select 和 $expand。

于 2013-06-02T19:14:07.430 回答
0

尝试使用 $expand 子句在我的情况下,我必须先添加一个 complexType:

builder.ComplexType();

另外我发现应该使用不同的查询来获取 UI 上的复杂类型

而不是调用 http://url/api/AccountDetails?$select=name,accountNumber,balance 应该使用另一个 url: http://url/api/AccountDetails?$select=name,accountNumber,balance&$expand=balance

您只能通过 $expand 看到复杂的属性,例如 balance

此外,打开 $expand 功能也很重要。为此,请在添加 edm 模型之前添加它:endpoints.Select().Expand().Filter().OrderBy().Count().MaxTop(10); endpoints.MapODataRoute("odata", "odata", this.GetEdmModel());

在此处查看详细信息:https ://stackoverflow.com/a/55476645/2050539

于 2021-09-09T08:55:01.603 回答