需要一个示例,说明如何将基本类型的集合传递给未绑定的函数/或操作,以及如何返回基本类型的集合。
例如列表或整数数组
这是一个简单的例子。
List<int> GetEvenNumbers(List<int> numbers)
{
// loop through numbers collection and return a list of the even numbers
}
以下网站讨论使用功能/操作但不解释传递/接收集合。
https://aspnet.codeplex.com/sourcecontrol/latest#Samples/WebApi/OData/v4/
我甚至在&#34;向我展示如何使用代码&#34;但没有收到回复 http://aspnet.uservoice.com/forums/228522-show-me-how-with-code/suggestions/6264729-odata-v4-passing-collection-as-parameter-to-unbou
以下是我的一些代码,但它似乎无法正常工作。
// in the controller
[HttpGet]
[ODataRoute("GetEvenNumbers(numbers={numbers})")]
public IHttpActionResult GetEvenNumbers(List<int> numbers)
{
List<int> evenNumbers = new List<int>();
foreach (var number in numbers)
{
if (number % 2 == 0)
{
evenNumbers.Add(number);
}
}
return Ok(evenNumbers);
}
// in the WebApiConfig
var testCollectionFunction = builder.Function("GetEvenNumbers");
testCollectionFunction.CollectionParameter<int>("numbers");
testCollectionFunction.ReturnsCollection<int>();
在WCF中,这非常简单,但在OData中并不是那么简单。
答案 0 :(得分:3)
据我所知,webapi odata不允许函数参数中的集合。但您可以使用Actions作为解决方法。
模型构建器:
var testCollectionFunction = modelBuilder.Action("GetEvenNumbers");
testCollectionFunction.CollectionParameter<int>("numbers");
testCollectionFunction.ReturnsCollection<int>();
控制器:
[HttpPost]
[ODataRoute("GetEvenNumbers")]
public IHttpActionResult GetEvenNumbers(ODataActionParameters parameter)
{
IEnumerable<int> numbers = parameter["numbers"] as IEnumerable<int>;
List<int> evenNumbers = new List<int>();
foreach (var number in numbers)
{
if (number % 2 == 0)
{
evenNumbers.Add(number);
}
}
return Ok(evenNumbers);
}
请求:
POST http://localhost:44221/odata/GetEvenNumbers HTTP/1.1
Host: localhost:44221
Connection: keep-alive
Content-Length: 17
{"numbers":[1,2]}
响应:
HTTP/1.1 200 OK
Content-Type: application/json; odata.metadata=full
OData-Version: 4.0
Content-Length: 109
{
"@odata.context":"http://localhost:44221/odata/$metadata#Collection(Edm.Int32)","value":[
2
]
}
答案 1 :(得分:0)
作为Cyrus&#39;回答说,OData函数既可以返回集合,也可以将它们作为参数。
在我的情况下,我有一个名为&#34; MostPopular&#34;的函数,定义为:
var mostPopFunc = svcHist.Collection.Function("MostPopular");
mostPopFunc.Parameter<DateTime>("From");
mostPopFunc.CollectionParameter<ServiceCodes>("ServiceCodes");
mostPopFunc.CollectionParameter<int>("ServiceUnits");
mostPopFunc.Parameter<string>("SearchCCL");
mostPopFunc.Parameter<int>("ListLength").OptionalParameter = true;
mostPopFunc.ReturnsCollection<ciExternalPartnerPopularResult.MarcIdPopularity>();
由于此函数绑定到实体集,因此我不需要提供路由映射,并且函数声明被削减为:
[HttpGet]
public async Task<IHttpActionResult> MostPopular([FromODataUri] DateTimeOffset from, [FromODataUri] IEnumerable<ServiceCodes> serviceCodes,
[FromODataUri] IEnumerable<int> serviceUnits,
[FromODataUri] string searchCcl, [FromODataUri] int listLength = ListLengthDefault)
{ // ...
}
int和其他简单类型不需要[FromODataUri]
装饰,但我并不介意它们。考虑到参数的数量,这个函数有点重,但我没时间为这个函数找到一个更好的接口。
最后,要从PostMan(或浏览器)调用它,GET请求看起来像这样:
{{url}}/ServiceHistories/Default.MostPopular(From=2016-10-07T12:41:59Z,ServiceCodes=['OnLoan'],ServiceUnits=[6471,6473],SearchCCL='TI+SE=Harry',ListLength=10)
因为时间戳而迫使我修改我的web.config:
<system.web>
<!-- This web service accepts datetimeoffset as a parameter and requires the ":" character to be supplied as part of the URL -->
<httpRuntime targetFramework="4.5" requestPathInvalidCharacters="<,>,%,&,\,?" />
</system.web>