0

我正在寻找使用微风 EFContextProvider 实现存储库模式。在这个存储库中,我将公开一种使用 OData 过滤查询数据库的方法......就像微风默认的行为一样。我还想公开一个忽略 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 过滤的方法。

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

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

4

1 回答 1

4

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

要控制 WebApi 中的过滤,请将ODataQueryOptions参数添加到您的 WebApi 控制器方法。这会阻止 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 并将过滤参数放在您自己的对象中(但是您必须将它们应用于自己查询)。

于 2013-06-24T20:42:31.790 回答