.net之如何在 Web Api 中手动执行 Breeze 过滤器
我想使用一些外部服务器端逻辑来修改查询结果的属性。为此,我需要应用 Breeze 查询选项、修改结果集并将其返回。
我基本上知道如何将 OdataQueryOptions
应用到我的查询中,但我不想错过 BreezeJS 能做而 Web Api 的 OData 不能做的所有事情。例如,我想保留 inlineCount
。
我该怎么做?有什么方法可以挂接到 Breeze 的查询修改代码吗?
以防万一,我使用的是 Entity Framework 6 和 Web Api 2。
请您参考如下方法:
好吧,我不确定是否有更好的方法(因为这似乎是一个常见用例的大量工作),但这是我解决这个问题的方法。
我继承了QueryHelper
类修改了PostExecuteQuery
方法来执行委托(delegate)。
public class ExtendedQueryHelper : QueryHelper
{
public ExtendedQueryHelperOptions Options { get; set; }
public ExtendedQueryHelper(ODataQuerySettings querySettings) : base(querySettings)
{}
public override IEnumerable PostExecuteQuery(IEnumerable queryResult)
{
if (Options != null && Options.PostExecuteQueryHandler != null)
{
return Options.PostExecuteQueryHandler(queryResult);
}
return base.PostExecuteQuery(queryResult);
}
}
委托(delegate)在名为 ExtendedQueryHelperOptions
的类中定义
public class ExtendedQueryHelperOptions
{
private const string EXTENDED_QUERY_HELPER_OPTIONS_KEY = "EXTENDED_QUERY_HELPER_OPTIONS_KEY";
public delegate IEnumerable PostExecuteQueryDelegate(IEnumerable queryResult);
public PostExecuteQueryDelegate PostExecuteQueryHandler { get; set; }
public void InjectIntoRequest(HttpRequestMessage request)
{
request.Properties.Add(EXTENDED_QUERY_HELPER_OPTIONS_KEY, this);
}
public static ExtendedQueryHelperOptions GetFromRequest(HttpRequestMessage request)
{
object options;
request.Properties.TryGetValue(EXTENDED_QUERY_HELPER_OPTIONS_KEY, out options);
return (ExtendedQueryHelperOptions)options;
}
}
为了设置这些选项,我必须继承 BreezeQueryableAttribute
并在创建 QueryHelper
时注入(inject)这些选项:
public class ExtendedBreezeQueryableAttribute : BreezeQueryableAttribute
{
protected HttpRequestMessage Request { get; set; }
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
Request = actionContext.Request;
base.OnActionExecuting(actionContext);
}
protected override QueryHelper NewQueryHelper()
{
var queryHelper = new ExtendedQueryHelper(GetODataQuerySettings());
queryHelper.Options = ExtendedQueryHelperOptions.GetFromRequest(Request);
return queryHelper;
}
}
现在我可以像这样注入(inject)要在过滤结果上运行的代码:
[BreezeController]
public class BreezeController : BaseController
{
//...
[HttpGet]
[ExtendedBreezeQueryable]
public IQueryable<Foo> Foos()
{
var options = new ExtendedQueryHelperOptions
{
PostExecuteQueryHandler = delegate(IEnumerable results) {
// This code will be run after the querying has been
// applied by Breeze
var foos = results.Cast<Foo>().ToList();
foreach (var foo in foos)
{
foo.ComputedProperty = ComputeSomething();
}
return foos;
}
};
// Inject these options into the Request, so the ExtendedBreezeQueryableAttribute
// can get to them later
options.InjectIntoRequest(Request);
return Db.Foos;
}
}
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。