Predicate 的基于 Linq 的通用替代方案?

2023-11-24

我有一个名为ICatalog如下所示,其中每个ICatalog有一个名称和一个方法,该方法将根据Predicate<Item>功能。

public interface ICatalog
{
     string Name { get; }
     IEnumerable<Item> GetItems(Predicate<Item> predicate);
}

目录的特定实现可以链接到各种格式的目录,例如XML或SQL数据库。

对于 XML 目录,我最终将整个 XML 文件反序列化到内存中,因此使用谓词函数测试每个项目不会增加更多开销,因为它已经在内存中了。

然而,对于 SQL 实现,我宁愿不将数据库的全部内容检索到内存中,然后使用谓词函数过滤项目。相反,我想找到一种方法以某种方式将谓词传递到 SQL 服务器,或者以某种方式将其转换为 SQL 查询。

这似乎是一个可以用 Linq 解决的问题,但我对它还很陌生。我的接口应该返回 IQueryable 吗?我现在不关心如何实际实现 ICatalog 的 SQL 版本。我只是想确保我的界面将来允许这样做。


Rob 已经指出了如何做到这一点(尽管更经典的 LINQ 方法可能需要Expression<Func<Item,bool>>,并可能返回IQueryable<IFamily>).

好消息是,如果您想将谓词与 LINQ-to-Objects 一起使用(对于您的 xml 场景),您可以使用:

Predicate<Item> func = predicate.Compile();

或(对于其他签名):

Func<Item,bool> func = predicate.Compile();

并且您有一名代表(func)来测试你的对象。

但问题是,这是一个恶梦单元测试 - 你只能真正一体化测试一下。

问题是您无法可靠地模拟(使用 LINQ-to-Objects)任何涉及复杂数据存储的内容;例如,以下内容在单元测试中可以正常工作,但不能针对数据库“真正”工作:

var foo = GetItems(x => SomeMagicFunction(x.Name));

static bool SomeMagicFunction(string name) { return name.Length > 3; } // why not

问题是只有部分操作可以转换为TSQL。你遇到同样的问题IQueryable<T>- 例如,EF 和 LINQ-to-SQL 支持对查询的不同操作;甚至只是First()行为不同(EF 要求您首先显式排序它,而 LINQ-to-SQL 则不然)。

总结来说:

  • 它可以工作
  • 但要仔细考虑一下你是否想这样做;更经典的黑盒存储库/服务接口可能更易于测试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Predicate 的基于 Linq 的通用替代方案? 的相关文章

随机推荐

  • mysql 分析器“发送数据”

    有没有对这些状态的解释 http dev mysql com tech resources articles using new query profiler html 我的具体问题是关于这个查询的 select count from 13
  • Java:更改 UI 字体 (Nimbus) 不起作用!

    我指的是这个 Nimbus 参考 我尝试将全局字体设置得稍大一些 UIManager put defaultFont new Font Font SANS SERIF 0 16 仅适用于菜单 但是nothing其他 按钮 标签 我尝试更改标
  • 为什么App更新后不兼容平板电脑

    我有一个应用程序 它已经推出了 2 年多了 并且自平板电脑问世以来就受到平板电脑的支持 我有一台 Asus Transformer 平板电脑 用于平板电脑测试 在我进行更新之前 该应用程序与平板电脑设备兼容 对于我最近的一组更改 我在 An
  • 如何使用 ngStyle (angular2) 添加背景图像?

    如何使用 ngStyle 添加背景图像 我的代码不起作用 this photo http dl27 fotosklad org ua 20121020 6d0d7b1596285466e8bb06114a88c903 jpg div div
  • Win32 相当于 .net SendKeys

    我正在设计一个从 Kinect 读取手势并执行一些操作的系统 我正在尝试包含能够将 HotKey 发送到应用程序的系统 我的系统是用 C 编写的 但 UI 是用 C net 编写的 我已经能够从 UI 部分使用 SendKeys 并且它确实
  • 如何在没有用户交互的情况下初始化全屏

    您好 我是初学者 我想创建一个网络应用程序 并且在页面加载时需要全屏帮助 无需用户交互 我在点击功能上有类似的东西可以正常工作 但我想在起始页加载功能 addEventListener click function var el docum
  • 将源代码隐藏在 .jar 文件中

    人们可以轻松提取 jar文件并查看源代码 我想保护源代码不被看到 一种可能的答案是使用密码保护文件 就像我们对 zip 文件所做的那样 但是 如果知道密码 则可以轻松查看源代码 有没有什么方法可以隐藏源代码并仍然能够运行 类似于什么 exe
  • python:使用 PyCharm 和 PyQt5 时进程已完成,退出代码 1

    我有三个 Python 3 4 3 脚本 其中之一是用于控制 PyQt5 生成的 ui 文件 当我运行 GUI 程序时 它接受所有数据和所有内容 当我按 InputDialog 上的 确定 按钮时 窗口将关闭并显示控制台 Process f
  • JavaScript 字符串赋值运算符

    我怎么可以用 在字符串上 但我不能使用 on it 例如 var test Test var arr 8660 test arr alert test Shows Test 8660 test arr alert test Shows Na
  • .net core 1.1:外部程序集的 Type.GetType 返回 null

    我正在将控制台应用程序移植到 NET core 该应用程序从外部库加载类型 在完整的 NET Framework 中使用Type GetType typename assemblyname 当程序集位于与可执行文件相同的文件夹中时有效 在
  • 在 Flutter 中迭代列表来渲染多个小部件?

    我有一个如下定义的字符串列表 var list one two three four 我想使用文本小部件在屏幕上并排呈现值 我尝试使用以下代码来尝试此操作 for var name in list return new Text name
  • 如何在 UIPickerView 标签旁边获得复选标记?

    The UIPickerView that appears in Safari has a check mark beside the current choice Is there a built in way to get this o
  • 如何在Android中的Webview中打开Excel、.doc文件?

    如何在 Android webview 中打开 Excel 和 doc 文件 谷歌文档可以支持吗 是的 Google doc 支持您显示 doc 或 excel pdf 文本或其他格式 WebView urlWebView WebView
  • 如何从 Android Google 令牌创建解析 _User 帐户?

    我发现了一些有用的信息片段 http blog parse com announcements bring your own login 向我展示如何登录 Android 应用程序once我有一个解析令牌 我可以成功获取手机 Google
  • 有关哈希盐的综合信息

    关于盐和最佳实践有很多问题 但大多数问题只是回答有关它们的非常具体的问题 我有几个相互关联的问题 假设数据库遭到破坏 每个用户的盐会阻止使用通用彩虹表来破解密码 必须为每个拥有唯一盐的用户生成一个单独的彩虹表才能获取其密码 这将是一个耗时的
  • 具有静态框架子依赖项的 XCFramework

    我有一个 XCFramework 它依赖于几个静态框架 我的 XCFramework 是在启用 BUILD FOR LIBRARIES FOR DISTRIBUTION 的情况下构建的 子框架不需要从 XCFramework 外部访问 当我
  • 将 Mercurial Repository 放在共享网络驱动器中是个好主意吗?

    我们是一个由 3 名开发人员组成的小团队 老板 我和另一名开发人员 主要是远程工作 我的任务是为 Mercurial HG 设置存储库服务器 看来我可以简单地将我们的集中存储库放在共享网络驱动器上 它的设置非常容易 但似乎存在我们任何人都可
  • 为什么预检请求仅在 Chrome 中失败,然后在尝试几次后就可以工作了?

    我在飞行前请求方面遇到了一个奇怪的问题 This is how it looks in the Chrome and other chromium based browsers after doing something in our ap
  • Spring Boot上传多部分413请求实体太大

    我有这样一个方法 RequestMapping method RequestMethod POST ResponseStatus HttpStatus CREATED ResponseBody PreAuthorize securitySe
  • Predicate 的基于 Linq 的通用替代方案?

    我有一个名为ICatalog如下所示 其中每个ICatalog有一个名称和一个方法 该方法将根据Predicate