4

我有这个存储库方法:

public IQueryable<TModel> GetAll()
{
    using (var context = new DatabaseContext())
    {
        return context.Set<TModel>().AsQueryable();
    }
}

TModel艺术家模型在哪里..无论如何

然后我在我的控制器中有这个动作:

// GET api/artist
[Queryable]
public IQueryable<ArtistModel> Get()
{
    return _repo.GetAll().AsQueryable();
}

现在..如果我将存储库方法更改为返回一个列表并添加.ToList我的结果..那么这会很好用。但是,无论有什么 OData 查询。我仍然会首先执行“获取所有查询”。将它们变成一个列表,然后我会针对该列表执行我的 OData 查询。

这似乎完全错误..我想做的是确保在我尝试从数据库中获取数据的同时执行 OData 查询..所以我只得到与查询匹配的非常具体的结果..而不是一大堆随后被查询的数据..

现在我DbContext遇到了在使用之外处理的问题..但我仍然需要关闭DbContext一些地方,一些如何..

有任何想法吗?

4

2 回答 2

3

Web api 的可查询扩展的最新版本有点令人困惑,因为它与以前的版本有很大的不同。在新版本中,您需要显式启用可查询支持或使用新的查询选项类。看到这个

编辑:一些代码,因为我现在在办公桌前

public IQueryable<TModel> GetAll(ODataQueryOptions opts)
    {
        var db = _repo.GetAll();
        return (IQueryable<TModel>) opts.ApplyTo(db);
    }
于 2013-03-08T16:23:48.183 回答
3

您可以通过几种方式启用可查询的 Web API,

  1. [Queryable]属性放在您的操作上。您的操作可以返回其中之一 - IEnumerable<T>, IQueryable<T>,HttpResponseMessage内容为ObjectContent<IQueryable<T>>or ObjectContent<IEnumerable<T>>, Task<IQueryable<T>>, Task<IEnumerable<T>>,Task<HttpResponseMessage>具有与之前相同的限制。

  2. 通过执行全局启用查询configuration.EnableQuerySupport()。这将启用查询所有返回IQueryable<T>.

  3. 如此处ODataQueryOptions<T>所述使用并自己手动应用查询。

关于DbContext处理问题,我们以一种懒惰的方式评估查询很晚 - 当格式化程序将响应写入流时。所以,你不应该DbContext在你的行动中处置。相反,将其与控制器一起处置,即覆盖控制器的Dispose方法并将其处置在那里。Web API 负责控制器的生命周期,并在请求完成处理时释放控制器。此外,您也可以使用Request.RegisterForDispose方法,在请求完成处理后处理任何资源。

于 2013-03-10T04:52:48.020 回答