Entity framework Breeze JS-带有EFContextProvider的存储库,启用/禁用OData筛选

Entity framework Breeze JS-带有EFContextProvider的存储库,启用/禁用OData筛选,entity-framework,odata,breeze,Entity Framework,Odata,Breeze,我希望用breeze EFContextProvider实现一个存储库模式。在这个存储库中,我将公开一个使用OData筛选查询数据库的方法。。。正如breeze在默认情况下的行为一样。我还想公开一个忽略OData筛选的方法,并返回一个元素列表,就像它是默认的EF上下文一样 因此,总而言之,我的想法是尝试这样做: public class RepositoryBaseEntity<T> : IRepository<T> where T : class { p

我希望用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>();
        }

}
公共类RepositoryBaseEntity:IRepository其中T:class
{
受保护的Breeze.WebApi.DataModelContainer\u上下文;
public RepositoryBaseEntity(Breeze.WebApi.EFContextProvider上下文)
{
_上下文=上下文;
}
/// 
///获取所有元素,忽略OData筛选
/// 
///所有元素,如果不存在,则为null
公共IEnumerable GetAll()
{            
//在Breeze.WebApi.EFContextProvider中禁用OData筛选
返回_context.context.Set();
}
/// 
///应用ODataFilters并获取元素。对于Web API控制器非常有用
/// 
/// 
public IEnumerable ApplyDataFiltersandGet()
{
//在Breeze.WebApi.EFContextProvider中启用OData筛选
返回_context.context.Set();
}
}
我一直在研究Breeze EFContextProvider,似乎没有办法禁用OData过滤

我考虑过,当我不需要OData筛选时,可能会使用普通的旧实体框架DataModelContainer,当我需要OData筛选时,可能会使用Breeze EFContextProvider包装器。。。但使用这种方法,我会有两个EF上下文。。。这是我想避免的事情。。。在过去的一些项目中,我们在使用多个EF上下文时遇到了一些问题


你们有办法吗?谢谢

在执行和JSON序列化结果之前,WebApi实际上应用了OData过滤。EFContextProvider提供初始查询,但它不应用OData筛选器,因为它不知道OData的任何信息

要控制WebApi中的过滤,请向WebApi控制器方法添加
ODataQueryOptions
参数。这将阻止WebApi应用过滤,并允许您改为:

public IEnumerable<Customer> Customers(ODataQueryOptions options)
{      
    if (youWantToApplyFilters)
    {
        return repository.ApplyODataFiltersAndGet(options);
    }
    else
    {
        return repository.GetAll();
    }
}
公共IEnumerable客户(ODataQueryOptions选项)
{      
如果(您想要应用过滤器)
{
返回repository.ApplyODataFiltersAndGet(选项);
}
其他的
{
返回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>();
}
//
///应用ODataFilters并获取元素。适用于Web API控制器
/// 
/// 
公共IEnumerable ApplyDataFiltersAndGet(ODataQueryOptions选项)
{
var set=_context.context.set();
返回options.ApplyTo(set.Cast();
}

请注意,
ODataQueryOptions
位于
System.Web.Http.OData.Query
中,这意味着您的存储库是特定于WebApi的。如果您不喜欢,您可以将筛选移出存储库并靠近控制器,或者您可以分离ODataQueryOptions并将筛选参数放入您自己的对象中(但是您必须自己将其应用于查询)在执行和JSON序列化结果之前,WebApi实际上应用了OData过滤。EFContextProvider提供初始查询,但它不应用OData筛选器,因为它不知道OData的任何信息

要控制WebApi中的过滤,请向WebApi控制器方法添加
ODataQueryOptions
参数。这将阻止WebApi应用过滤,并允许您改为:

public IEnumerable<Customer> Customers(ODataQueryOptions options)
{      
    if (youWantToApplyFilters)
    {
        return repository.ApplyODataFiltersAndGet(options);
    }
    else
    {
        return repository.GetAll();
    }
}
公共IEnumerable客户(ODataQueryOptions选项)
{      
如果(您想要应用过滤器)
{
返回repository.ApplyODataFiltersAndGet(选项);
}
其他的
{
返回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>();
}
//
///应用ODataFilters并获取元素。适用于Web API控制器
/// 
/// 
公共IEnumerable ApplyDataFiltersAndGet(ODataQueryOptions选项)
{
var set=_context.context.set();
返回options.ApplyTo(set.Cast();
}

请注意,
ODataQueryOptions
位于
System.Web.Http.OData.Query
中,这意味着您的存储库是特定于WebApi的。如果您不喜欢,您可以将筛选移出存储库并靠近控制器,或者您可以分离ODataQueryOptions并将筛选参数放入您自己的对象中(但之后您必须自己将其应用于查询)。

好的,我明白了,OData筛选在序列化结果之前就应用了。这些过滤器不会影响任何其他数据检索操作。然后,启用/禁用这些过滤器没有多大意义,因为它们将只应用于实际从javascript请求调用的方法中。很好,非常感谢!好的,我明白了,OData过滤是在序列化结果之前应用的。这些过滤器不会影响任何其他数据检索操作。然后,启用/禁用这些过滤器没有多大意义,因为它们将只应用于实际从javascript请求调用的方法中。很好,非常感谢!