我想“拦截”/更改使用OD API与Web API生成的OData查询..但我不完全确定如何“提取”生成的查询..我假设OData过滤器,扩展和更多一些如何生成某种表达式树或某种类型的查询...如果是这种情况,那么这是我希望能够在作为SQL发送到数据库之前更改的查询类型-command。
我在网上搜索了一些提取生成的表达式树的方法..但是无法找到足够的信息,所以我有点希望这里有人能更深入地了解整个OData-“框架“工作..
任何从哪里开始的想法?
答案 0 :(得分:0)
您可以在执行之前更改Odata URL。从EnableQueryAttribute类继承并更改url。以下是一个实际案例,可以在将guid字符串格式发送到oracle之前将其更改为十六进制字符串格式。
public class EnableQueryForGuid : EnableQueryAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var url = actionContext.Request.RequestUri.OriginalString;
var newUrl = ModifyUrl(url);
actionContext.Request.RequestUri = new Uri(newUrl);
base.OnActionExecuting(actionContext);
}
private string ModifyUrl(string url)
{
Regex regex = new Regex(@"%27([A-Za-z0-9]{32})%27");
var res = regex.Matches(url);
if (res.Count > 0)
{
var guidPart = res[0].Value.Remove(0, 3);
guidPart = guidPart.Remove(guidPart.Length - 3, 3);
var guidValue = new Guid(BitConverter.ToString((new Guid(guidPart)).ToByteArray()).Replace("-", ""));
url = url.Replace(res[0].Value, guidValue.ToString());
}
return url;
}
}
然后在控制器方法上使用此新属性:
[HttpGet]
[EnableQueryForGuid]
[ODataRoute("GetSomething")]
public IHttpActionResult GetSomething()
{
....
}
原始查询:
OData / GetSomething?&$ filter = MyGuid%20eq%20%272C3C7BC0EC7FA248B0DEE3DAA371EE73%27
更改的查询:
OData / GetSomething?&$ filter = MyGuid%20eq%20e5794d6a-5db1-475a-8c49-0f91a8f53c8a