查询

时间:2015-04-29 19:57:40

标签: asp.net-web-api odata

我有一个使用Entity Framework和Odata的ASP.NET Web API应用程序。

我想在使用GET时修改查询结果...目前,在控制器中,您实际上只是将EntityFramework数据实体传递回Odata处理程序......

[EnableQuery]
public IQueryable<myEntity> GetLineItem()
{
    return db.myEntities;
}

通过简单地返回子集

,可以很容易地将Odata传递给它的任何查询添加到其中
return db.myEntity.Where(myEntity => myEntity.Name == "Bob")

Odata会将$ filter querystring参数中的任何内容添加到此处传递的表达式中,并获得这些结果的子集。

但是,我想在查询执行后迭代结果,并将SQL结果解析为实体对象。

我尝试创建一个实现IQueryable接口的包装器,并挂钩到GetEnumerator方法,并为IProvider提供相同的方法并挂钩到execute方法。 Odata似乎没有使用其中任何一个。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:7)

您可以通过实施过滤器来实现。过滤器只是一个属性,您可以将其应用于操作(控制器的方法),控制器(控制器的类)或注册整个应用程序。

此过滤器应用于管道的某个步骤:有一个管道,从传入的HTTP请求到控制器操作,然后返回到响应,您可以在此管道的不同位置包含一个过滤器,以进行修改流经这条管道的数据。

您特别需要继承ActionFilterAttribute,并在执行控制器操作后执行的OnActionExecuted上进行后期处理。

文档:

最后一个类是OnActuonExecuted方法的参数类型,包含您可以修改的响应。

本文的第一部分包含对操作过滤器的说明: WEB API 2 USING ACTIONFILTERATTRIBUTE, OVERRIDEACTIONFILTERSATTRIBUTE AND IOC INJECTION

答案 1 :(得分:0)

使用OData时,您不必从控制器返回IQuerable。检查&#34;直接调用查询选项&#34; https://docs.microsoft.com/en-us/aspnet/web-api/overview/odata-support-in-aspnet-web-api/supporting-odata-query-options部分 对于您的情况,它看起来像:

import matplotlib.pyplot as plt

def plot_func(xdata, ydata, subplot_kw={}, axis_setters=None):
    fign = subplot_kw.get("num", False)
    title = subplot_kw.pop("title", False)
    if fign and fign in plt.get_fignums():
        fig = plt.figure(fign)
        ax = fig.get_axes()[0]
        #process other subplot_kw here
    else:
        fig, ax = plt.subplots(**subplot_kw)
    if title:
        fig.canvas.set_window_title(title)
    if axis_setters:
        for setter_name, setter_value in axis_setters.items():
            setter_func = getattr(ax, setter_name)
            setter_func(setter_value)

    ax.plot(xdata, ydata)
    return fig, ax

if __name__ == "__main__":
    for i in range(10):
        plot_func([1,2,3], [1,i,3], subplot_kw={"num": 2, "title" : "mytitle"}, 
                  axis_setters={'set_title': 'Title'})
    plt.show()

答案 2 :(得分:0)

在Ihar answer的基础上,这是一个应用查询选项然后修改结果集合的完整示例。

cText = $(".content").html().substr(0, length).trim();