Breeze JS - 使用EFContextProvider的存储库,启用/禁用OData过滤

时间:2013-06-24 09:23:42

标签: entity-framework odata breeze

我希望使用breeze EFContextProvider实现存储库模式。在这个存储库中,我将公开一个方法来使用OData过滤来查询数据库...就像breeze默认情况下一样。我还想公开一个忽略OData过滤的方法,并返回一个元素列表,就像它是默认的EF上下文一样。

所以,总而言之,我的想法是尝试做这样的事情:

public class RepositoryBaseEntity<T> : IRepository<T> where T : class
{
        protected Breeze.WebApi.DataModelContainer _context;

        public RepositoryBaseEntity(Breeze.WebApi.EFContextProvider<DataModelContainer> context)
        {
            _context = context;
        }

        /// <summary>
        /// Gets all elements, ignoring OData filtering
        /// </summary>
        /// <returns>All elements, or null if none exists</returns>
        public IEnumerable<T> GetAll()
        {            
            // disable OData filtering in Breeze.WebApi.EFContextProvider
            return _context.Context.Set<T>();
        }


        /// <summary>
        /// Apply ODataFilters and get elements. Useful for Web API controllers
        /// </summary>
        /// <returns></returns>
        public IEnumerable<T> ApplyODataFiltersAndGet()
        {
            // enable OData filtering in Breeze.WebApi.EFContextProvider
            return _context.Context.Set<T>();
        }

}

我一直在看Breeze EFContextProvider,似乎没有一种方法可以禁用OData过滤。

虽然我不想使用普通的实体框架DataModelContainer但我不想要OData过滤,并且当我想要OData过滤时使用Breeze EFContextProvider包装器......但是使用这种方法我会有两个EF上下文...以及我想要避免的事情......过去在其他一些项目中我们使用多个EF上下文时遇到了一些问题。

那么,你们看到有什么办法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

OData过滤实际上是在执行和JSON序列化结果之前由WebApi应用的。 EFContextProvider提供初始查询,但它不应用OData过滤器,因为它对OData一无所知。

要在WebApi中控制过滤,请在WebApi控制器方法中添加ODataQueryOptions参数。这可以防止WebApi应用过滤,并允许您这样做:

public IEnumerable<Customer> Customers(ODataQueryOptions options)
{      
    if (youWantToApplyFilters)
    {
        return repository.ApplyODataFiltersAndGet(options);
    }
    else
    {
        return repository.GetAll();
    }
}

然后,在您的存储库中,

/// <summary>
/// Apply ODataFilters and get elements. Useful for Web API controllers
/// </summary>
/// <returns></returns>
public IEnumerable<T> ApplyODataFiltersAndGet(ODataQueryOptions options)
{
    var set = _context.Context.Set<T>();
    return options.ApplyTo(set).Cast<T>();
}

请注意ODataQueryOptions位于System.Web.Http.OData.Query,这意味着您的存储库将是特定于WebApi的。如果你不喜欢这样,你可以将过滤从存储库中移出并靠近控制器,或者你可以拆开ODataQueryOptions并将过滤参数放在你自己的对象中(但是你必须将它们应用到查询你自己)。