如何接受查询和 return 异步任务?

How to accept a query and return an async task?

我遇到以下异常:

Cannot create an EDM model as the action 'Get' on controller 'Accounts' has a return type 'System.Web.Http.IHttpActionResult' that does not implement IEnumerable<T>.

尝试查询我的端点时:

http://localhost:8267/api/accounts

正在执行工作的 AccountsController:

    public async Task<IHttpActionResult> Get(ODataQueryOptions options)
    {
        var query = options.Request.RequestUri.PathAndQuery;
        var client = new HttpClient();
        var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/";
        HttpResponseMessage response = await client.GetAsync(crmEndPoint+query);
        object result;
        if (response.IsSuccessStatusCode)
        {
            result = await response.Content.ReadAsAsync<object>();

            return Ok(result);
        }

        return NotFound();
    }

我做错了什么?我如何简单地将 PathAndQuery 添加到我的 crmEndPoint 和 return 结果?

OData 框架在纯 Web API 之上提供额外的响应 formatting/querying 规则。

使用 ODataQueryOptions 参数 要求 操作方法 returns IQueryable<T>IEnumerable<T>

ODataQueryOptions 只是帮助解析传入的 OData 请求 url,使 $filter$sort 等参数可通过属性访问。

您的代码不需要此服务,因为它所做的只是将请求重定向到 crmEndPoint。因此,您可以通过控制器的 Request 属性 访问请求对象,而不是使用 options.Request 并完全删除参数。

代码如下:

public async Task<IHttpActionResult> Get()
{
    var query = Request.RequestUri.PathAndQuery;
    var client = new HttpClient();
    var crmEndPoint = @"HTTPS://MYCRMORG.COM/API/DATA/V8.1/";
    HttpResponseMessage response = await client.GetAsync(crmEndPoint + query);
    object result;
    if (response.IsSuccessStatusCode)
    {
        result = await response.Content.ReadAsAsync<object>();

        return Ok(result);
    }

    return NotFound();
}