递归地 (?) 将 LINQ 谓词组合成单个谓词

2023-12-26

(编辑:我问错了问题。real我遇到的问题已经结束将 LINQ-to-SQL 谓词组合成单个谓词 https://stackoverflow.com/questions/3782940/compose-linq-to-sql-predicates-into-a-single-predicate- 但这得到了一些很好的答案,所以我把它留下了!)

给定以下搜索文本:

"keyword1 keyword2 keyword3   ... keywordN"

我想最终得到以下 SQL:

SELECT [columns] FROM Customer 
  WHERE 
    (Customer.Forenames LIKE '%keyword1%' OR Customer.Surname LIKE '%keyword1%')
  AND
     (Customer.Forenames LIKE '%keyword2%' OR Customer.Surname LIKE '%keyword2%')
  AND 
    (Customer.Forenames LIKE '%keyword3%' OR Customer.Surname LIKE '%keyword3%')
  AND
    ...
  AND 
    (Customer.Forenames LIKE '%keywordN%' OR Customer.Surname LIKE '%keywordN%')

实际上,我们按空格分割搜索文本,修剪每个标记,基于每个标记构建一个多部分 OR 子句,然后将这些子句进行 AND 运算。

我在 Linq-to-SQL 中执行此操作,但我不知道如何基于任意长的子谓词列表动态组合谓词。对于已知数量的子句,很容易手动组成谓词:

dataContext.Customers.Where(
    (Customer.Forenames.Contains("keyword1") || Customer.Surname.Contains("keyword1")
    &&
    (Customer.Forenames.Contains("keyword2") || Customer.Surname.Contains("keyword2")
    &&
    (Customer.Forenames.Contains("keyword3") || Customer.Surname.Contains("keyword3")
);

但我想处理任意搜索词列表。我已经到达

Func<Customer, bool> predicate = /* predicate */;
foreach(var token in tokens) {
    predicate = (customer 
        => predicate(customer) 
        && 
         (customer.Forenames.Contains(token) || customer.Surname.Contains(token));
}

这会产生一个 StackOverflowException - 大概是因为赋值的 RHS 上的 predicate() 直到运行时才真正被评估,此时它最终会调用自己......或者其他东西。

简而言之,我需要一种技术,在给定两个谓词的情况下,将返回由两个源谓词与提供的运算符组成的单个谓词,但仅限于 Linq-to-SQL 显式支持的运算符。有任何想法吗?


我会建议另一种技术

你可以做:

var query = dataContext.Customers;

然后,在一个循环内做

foreach(string keyword in keywordlist)
{
    query = query.Where(Customer.Forenames.Contains(keyword) || Customer.Surname.Contains(keyword));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

递归地 (?) 将 LINQ 谓词组合成单个谓词 的相关文章

随机推荐

  • android.content.ActivityNotFoundException“android.settings.IGNORE_BATTERY_OPTIMIZATION_SETTINGS”

    我正在尝试引导我的用户进行电池优化活动 它似乎对大多数手机都有效 除了一些搭载 Android 6 的三星手机 我得到 Fatal Exception android content ActivityNotFoundException No
  • Angular 2,实现 OnActivate 的组件永远不会调用 routerOnActivate 方法

    我正在尝试使用 Angular 2 Router 记录当前路由 使用官方文档中的示例代码 https angular io docs ts latest api router OnActivate interface html https
  • 在多模块项目上作为“一件”运行 Proguard

    TLDR 如何将 proguard 映射传递给 javac 以针对混淆库进行编译 这很长 但我不知道如何缩短它 背景 我有以下产品设置 Android Studio项目 图书馆模块 子 模块核心 子 模块 A 子 模块 B 子 模块 C 示
  • 是否可以在 64 位 Windows 7 上使用 Qt4 获得本机菜单?

    用 Qt 4 编写的应用程序在 64 位 Windows 7 上运行时没有本机菜单 对于 VLC Lyx 等知名应用程序来说也是如此 Qt 菜单的行为与本机菜单不同 这可能很烦人 作为示例 请考虑下面的屏幕截图 如果鼠标沿着红色路径快速移动
  • 添加产品时,WooCommerce 将追加销售产品添加到购物车

    我正在尝试在我的 WooCommerce 主题中实现自定义追加销售功能 当用户添加产品时 我需要将额外的产品 追加销售 添加到其购物车 这意味着我必须向产品添加一个额外的参数 该参数允许我获取产品 追加销售的关系 并在从购物车中删除产品时删
  • 每月第一天的工作日

    我需要获取该月第一天的工作日 例如 对于当前月份 2013 年 9 月 第一天是星期日 首先 获取当月的第一天 例如 NSDate today NSDate date NSCalendar gregorian NSCalendar allo
  • 尝试更新测试版时 Google Play 出现错误

    当我尝试将新的 apk 上传到我的 beta 频道时 我收到此错误 Errors 在开始推出此版本之前解决这些错误 您无法推出此版本 因为它不允许任何现有用户升级到新添加的 APK 在我的 alpha 频道中 女巫的更新频率要高得多 我可以
  • Matplotlib条形图不绘制边框/边缘

    我的条形图有这个代码 ax1 plt subplot2grid 1 1 0 0 ax1 bar edges2 Nnorm width 0 02 edgecolor green linewidth 20 我认为这应该使我的条形图具有绿色边缘
  • 在酸洗 numpy 数组的子类时保留自定义属性

    我创建了 numpy ndarray 的子类如下numpy 文档 http docs scipy org doc numpy user basics subclassing html 特别是 我有添加了自定义属性 http docs sci
  • 在子组件 React Native 中关闭模式

    我有两个本机组件 我无法从我的子组件中关闭模式 ListTrips 家长 ModalAddTrip 子级 ListTrips js import ModalAddTrip from ModalAddTrip this state isMod
  • Objective C 阻止异步回调和错误访问

    我有一个严重的疑问 假设以下场景 你有一个UIViewController在屏幕上 例如 应用程序使用块作为回调来启动后端调用 您使用 自我 代理来防止保留循环 用户点击 返回 然后UIViewController被释放 迟早 回调块会被执
  • Objective-C enumerateObjectsUsingBlock 与快速枚举?

    以下两种方法的优点和缺点是什么 使用块枚举 https developer apple com documentation foundation nsarray 1415846 enumerateobjectsusingblock lang
  • android错误:删除片段时“提交已调用”

    我想实现一个有片段的活动 当我点击 Fragment1 时 Fragment2 被调用 当我点击 Fragment2 时 Fragment2 应该从屏幕上删除 我通过在 onCreateView 中调用 Fragment2 LinearLa
  • Visual Studio Team Services - 构建失败,定义错误?

    我从事一个项目已经有一段时间了 现在我想使用 Visual Studio Team Services 在本地 Visual Studio 中的构建不会给出错误 并且应用程序按预期工作 我已将此工作代码签入 VSTS 因此它位于存储库中并且可
  • 计数返回空白而不是 0

    今天是个好日子 这是我的代码 SELECT Expired Item DateName mm DATEADD MM 4 AE fld LOAN as Month COUNT PIT fld ID COUNT SUM PIT fld GRAM
  • Android 上的 kivy/Python 缺少 Unicode 编解码器?

    我有一个在 kivy 下运行的程序 它在 Windows 上运行良好 但在 Android 上打开文件失败 两个平台上都是 1 8 0 奇怪的是 当我明确要求 utf 8 时 错误消息表明它正在尝试解码 ASCII 而且该文件中的任何位置都
  • 如何解压和打包pkg文件?

    我有一个由 Install Maker for Mac 创建的 pkg 文件 我想替换 pkg 中的一个文件 但我必须在Linux系统下执行此操作 因为这是下载过程的一部分 当用户开始下载文件时 服务器必须替换 pkg 中的一个文件 我有一
  • 编译 gtkmm 时出现问题

    操作系统 Fedora 14 编译器 g GCC 4 5 1 20100924 红帽 4 5 1 4 我通过 yum 从存储库安装了 gtkmm24 devel 为了确保安装按计划进行 我决定尝试页面上的示例之一 include
  • Oracle 中的动态表分区

    我正在为我的应用程序构建一个数据库存储 该存储由一个具有巨大数据量 数亿条记录 的表组成 我计划在日期字段上建立索引 因为我将不时地对给定时间段内的所有记录进行批量恢复 例如 检索第二天的所有记录 午夜 由于记录数量巨大并且性能是该系统中的
  • 递归地 (?) 将 LINQ 谓词组合成单个谓词

    编辑 我问错了问题 real我遇到的问题已经结束将 LINQ to SQL 谓词组合成单个谓词 https stackoverflow com questions 3782940 compose linq to sql predicates