.net之如何在 Web Api 中手动执行 Breeze 过滤器

zhoujg 阅读:39 2025-02-15 21:57:57 评论:0

我想使用一些外部服务器端逻辑来修改查询结果的属性。为此,我需要应用 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; 
    } 
} 


标签:WEB
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号