将Linq语句添加到Web API获取过滤器,我正在尝试添加$ select

时间:2012-08-13 18:58:13

标签: linq asp.net-web-api odata

我尝试将一些linq语句应用于我的所有Get Web api命令。我想我可以使用ActionFilterAttribute

来做到这一点

我基本上在web api中添加$ select支持,因为它目前不受支持。我不确定从哪里得到IQueryable结果。我相信在sql执行发生之前我需要它但在Get函数返回IQueryable结果之后。任何帮助都会很棒。我正在尝试与this post类似的内容,但他的想法不起作用,因为HttpResponseMessage response = actionExecutedContext.Result;已不在RC中。

由于 尼克


溶液

        public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext actionExecutedContext)
    {
        HttpRequestMessage request = actionExecutedContext.Request;
        HttpResponseMessage response = actionExecutedContext.Response;

        IQueryable obj;

        if (response != null && response.TryGetContentValue(out obj) && request.RequestUri.ParseQueryString()["$select"] != null)
        {

            System.Collections.Specialized.NameValueCollection QueryItems = request.RequestUri.ParseQueryString();
            string select = QueryItems["$select"];

            if (!string.IsNullOrWhiteSpace(select))
            {
                obj = obj.Select(string.Format("new ({0})", select));

            }

            //
            //this should be generic not hard coded for Json
            //
            string json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);

            actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse();
            actionExecutedContext.Response.Content = new StringContent(json);
            actionExecutedContext.Response.Content.Headers.Clear();
            actionExecutedContext.Response.Content.Headers.Add("Content-Type", "application/json");
            actionExecutedContext.Response.StatusCode = System.Net.HttpStatusCode.OK;

        }


    }

1 个答案:

答案 0 :(得分:0)

见上面的原帖。我将解决方案添加到底部。