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

2024-03-25

我正在寻找使用微风 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 中的过滤,请添加ODataQueryOptionsWebApi 控制器方法的参数。这会阻止 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(使用前将#替换为@)

Breeze JS - 带有 EFContextProvider 的存储库,启用/禁用 OData 过滤 的相关文章

随机推荐

  • 您的应用当前面向 API 级别 30,并且必须至少面向 API 级别 31,以确保它基于最新的 API 构建

    我只是想在 Google Play 商店上部署一个应用程序并收到此错误 如何将我的目标 api 更改为 31 我知道它需要更改build gradle文件下android 这是我的 ext buildToolsVersion 29 0 3
  • 交互式数据表:重新渲染表后保留列过滤器

    第一次在这里发海报 我通常不用发帖就能得到所有答案 但这一个确实难倒了我 我是一名中级 R 用户 没有任何 javascript 经验 这就是我想做的 我有一个数据表 它通过操作按钮使用交互式闪亮过滤器 对我的数据进行子集化 还使用内置数据
  • 如何为仅包含 ibdata 和 *.ibd 文件的 MySQL InnoDB 表重新创建 FRM 文件?

    这个问题与我在 stackoverflow 上看到的相关 InnoDB 修复问题略有不同 假设我在 MySQL 5 1 数据库中使用 innodb file per table 1 恢复了以下内容 db tablename ibd inno
  • 从存储过程中的 SELECT 语句获取标量值

    我知道从存储过程返回标量值的首选方法是使用RETURN or an OUTPUT范围 但是假设我有一个使用 select 语句返回值的存储过程 CREATE PROC spReturnNumber AS SELECT 1 是否可以从另一个存
  • 嵌入Python2和Python3解释器,选择运行时使用哪一个

    有没有一种好方法可以将Python2和Python3解释器嵌入到C程序中 然后运行其中一个or另一个是在运行时做出的决定 这是一个尝试示例 生成文件 all main main main c librun in py2 so librun
  • 如何从对象数组中提取属性并对其进行切片?

    所以我有一个对象数组 它返回电话号码 业务号码和名称 我正在尝试提取businessNumber 和phoneNumber 并希望将它们从 中切片以仅显示最后4 位数字 我能够使用地图来提取businessNumber 但是我如何拆分并以所
  • 自动完成“不是一个函数”

    我们已经在一个简单的 HTML 页面中测试了 Jquery UI jquery ui 1 8 10 custom min js 自动完成功能 该功能有效 然后 我们将相同的代码复制到 Asp net 用户控件中 它就会停止工作 Javasc
  • C# 中 RAM 耗尽时会发生什么?

    我不是计算机专家 所以让我尝试更具体地提出这个问题 我做了一些科学计算 计算有时需要大量内存来存储结果 几天前 我的输出文件占用了 4 GB 的硬盘空间 但我有这么大的 RAM 所以 当您运行的程序分配的内存多于计算机中可用的内存时 CLR
  • 如何将毫秒转换为日期字符串?

    我从服务器得到一个毫秒字符串 如下所示 1345623261 我如何将其转换为正常的日期格式 例如2012 年 8 月 30 日 我尝试使用setMilliseconds 像这样 new Date setMilliseconds time
  • 用不同的猜名称猜数字游戏

    这是我第一次使用 stackoverflow 进行访问 我是编程新手 正在学习 Python 初学者课程 很高兴开始 我们的第二个作业要求我们创建著名的猜数字游戏 对于那些已经了解这个游戏的人 我希望对添加到其中的额外部分提供一些帮助 我们
  • Robolectric junit 测试 - 缺少互联网许可

    我正在为 ma 应用程序开发一些 JUnit 测试 我需要使用 Robolectric Roboguice 库 我现在想做的只是简单的测试 检查 Activity 是否不为空 这是我的代码 RunWith RobolectricGradle
  • VS 解决方案文件的 Windows 资源管理器上下文菜单中的“构建”项?

    我想知道为什么默认情况下不集成它 我希望在 VS 解决方案文件的 Windows 资源管理器的文件上下文菜单中有一个项目来构建它 有这个工具吗 或者我必须自己创建这个 MSBuild Shell 扩展已经存在多年了 http msbuild
  • Jackson 反序列化抽象类

    我正在尝试使用 JSON ObjectMapper 反序列化对象 尝试反序列化时我看到以下错误 com fasterxml jackson databind JsonMappingException 无法构造 com phoenix typ
  • 如何隐藏微调器下拉菜单android

    我想隐藏外部点击时弹出的微调提示 如果提示弹出窗口打开并且用户按主页键活动将最小化 因此当用户再次打开应用程序时 提示弹出窗口应该消失 有什么办法可以实现这一点吗 谢谢 编辑 提示弹出窗口未自定义 所以我不能把它们藏起来onPause or
  • 为什么 Postgres 复制流在单独的函数中使用时不起作用?

    我正在研究 postgres 复制流 API 在处理它的过程中遇到了异常行为 当我使用复制槽在主块内编写整个代码时 一切正常 public class Server implements Config public static void
  • 如何使用LocalBroadcastManager?

    如何使用 定位LocalBroadcastManager如中所述谷歌文档 http developer android com reference android support v4 content LocalBroadcastManag
  • 我可以按顺序链接异步任务吗(在上一个异步任务完成后开始一个)

    每次我做一个httpRequest 当代码执行时 屏幕会被锁定几秒钟 因此我用了AsyncTask做我所有的httpRequest东西在一个单独的线程 同时提出ProgressDialog所以用户知道发生了什么事 我最近遇到了以下情况 我的
  • 角-聚合物相互作用

    我计划尝试 AngularJS 中的一个项目 其中所有组件都将使用 Polymer 开发 在开始这个项目之前 我有几个疑问 使用 Angular 服务获取数据后 我可以更新 Polymer 组件数据模型 也可以通过 UI 吗 如果是 那么如
  • 之前和之后的样式输入范围

    我正在关注这个方法 http css tricks com styling cross browser compatible range inputs css 来自 CSS Tricks 来设置输入范围的样式 并尝试使用之前和之后的伪类 下
  • Breeze JS - 带有 EFContextProvider 的存储库,启用/禁用 OData 过滤

    我正在寻找使用微风 EFContextProvider 实现存储库模式 在此存储库中 我将公开一种使用 OData 过滤来查询数据库的方法 就像默认情况下微风的行为一样 我还想公开一个忽略 OData 过滤的方法 并返回一个元素列表 就好像