我试图将一些 linq 语句应用于我的所有 Get Web api 命令。我想我可以使用ActionFilterAttribute
.
我基本上是在 web api 中添加 $select 支持,因为它目前不受支持。我不确定从哪里得到IQueryable
结果。我相信我在执行 sql 之前需要它,但在 Get 函数返回IQueryable
结果之后。任何帮助都会很棒。我正在尝试与这篇文章类似的东西,但他的想法将行不通,因为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;
}
}