我希望使用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上下文时遇到了一些问题。
那么,你们看到有什么办法吗?谢谢!
答案 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并将过滤参数放在你自己的对象中(但是你必须将它们应用到查询你自己)。