gpt4 book ai didi

c# - 如何只选择 OData 子元素

转载 作者:行者123 更新时间:2023-11-30 20:41:01 25 4
gpt4 key购买 nike

我正在构建一个 OData 应用程序,我正在努力研究如何检索结果并仅包含某些(子属性)。

首先,让我向您展示我的构建器中的注册:

builder.EntitySet<AggregatedArticlesSearchModel>("Search").EntityType.HasKey(x => x.Name);

现在,转到我从查询中返回的模型:

<EntityType Name="AggregatedArticlesSearchModel">
<Key>
<PropertyRef Name="Name"/>
</Key>
<Property Name="Name" Nullable="false" Type="Edm.String"/>
<Property Name="Values" Type="Collection(Zevij_Necomij.Mobile.App.Api.Models.OccurenceViewModel)"/>
</EntityType>
<ComplexType Name="OccurenceViewModel">
<Property Name="Value" Type="Edm.String"/>
<Property Name="Count" Nullable="false" Type="Edm.Double"/>
<Property Name="Articles" Type="Collection(Zevij_Necomij.Mobile.App.Api.Models.AggregatedArticleDescriptionViewModel)"/>
</ComplexType>
<ComplexType Name="AggregatedArticleDescriptionViewModel">
<Property Name="Name" Type="Edm.String"/>
<Property Name="Specification" Type="Edm.String"/>
<Property Name="Brand" Type="Edm.String"/>
</ComplexType>

当我执行获取数据的请求时,我并没有做任何花哨的事情,只是从数据库返回结果:

public async Task<IHttpActionResult> Get()
{
// Create all the managers for the platform context that are required by the application.
var classificationManager = Context.CreateManager(typeof(AggregatedArticleManager<>)) as AggregatedArticleManager<IAggregatedArticleStore<AggregatedArticle>>;

var classifications = await classificationManager.GetAllAsync();

var returnList = classifications.OrderBy(x => x.Name).Select(AggregatedArticlesSearchModel.MapFromDbModel).ToList();

return Ok(returnList.AsQueryable());
}

因为我正在处理子对象,所以列表会变得非常庞大:

{
"@odata.context": "http://api.mobileapp.appserver.dev.dsoft.be/OData/$metadata#Search",
"value": [
{
"Name": "(Veiligheids)slipkoppeling",
"Values": [
{
"Value": "ja",
"Count": 118,
"Articles": [
{
"Name": "230 V Sleuvenzaag",
"Specification": "Compacte machine",
"Brand": "Makita"
},
{
"Name": "230V Cirkelzaag SJS",
"Specification": "Softstart voor
},
}
}

我可以在一个集合中包含一千篇文章,因此,通过 Web Api 返回的方法很多。因为我不需要在单个请求中使用所有这些属性,所以我想让客户端使用 ?$select 参数只检索子属性,因此客户端可以说例如:

OData/Search?$select=Values

这里的问题是,例如,我只想返回计数,因此,我认为这样的请求是可能的:

OData/Search?$select=Values/Count

但是,这会导致 OData 错误:“URI 中指定的查询无效。在 select 子句中找到具有多个导航属性的路径或错误的复杂属性路径。请改写您的查询,以便选择或展开的每个级别仅包含 TypeSegments 或 Properties。”

有人知道如何解决这个问题吗?

最佳答案

@复杂度

据我所知,不支持在属性中选择子属性。

但是,如果您将 OccurenceViewModel 构建为实体类型,则可以使用 $expand 中的嵌套 $select 来满足您的要求。

例如:

1) 构建实体类型

builder.EntitySet<OccurenceViewModel>("ViewModels").EntityType.HasKey(x => x.Value);

那么,AggregatedArticlesSearchModel 中的Values 应该是一个导航属性。

2) 现在,您可以按如下方式发出 GET 请求以仅返回 Count 属性:

GET ~/odata/Search?$select=Values&$expand=Values($select=Count)

然后,有效负载应如下所示:

{
"@odata.context":"http://localhost/odata/$metadata#Search(Values,Values(Count))","value":[
{
"Values":[
{
"Count":101.0
},{
"Count":102.0
}
]
},{
"Values":[
{
"Count":101.0
},{
"Count":102.0
}
]
}
]
}

希望对您有所帮助。谢谢。

关于c# - 如何只选择 OData 子元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32690408/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com