我正在寻找使用微风 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 上下文时遇到了一些问题。
那么,你们看到有什么方法可以做到这一点吗?谢谢!
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
is in System.Web.Http.OData.Query
,这意味着您的存储库将是特定于 WebApi 的。如果您不喜欢这样,您可以将过滤移出存储库并更靠近控制器,或者您可以拆开 ODataQueryOptions 并将过滤参数放入您自己的对象中(但随后您必须将它们应用到自己查询)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)