Lambda/Linq 包含多个关键字的条件

2024-02-27

我必须列出

  1. 带有评论字段的主列表
  2. 要搜索的关键字列表。

我想搜索每条记录的每个注释字段中的关键字,在 SQL 中如下所示

select * from MainList
where Comment like '%keyword1%'
or Comment like '%keyword2%'
... so on until the last keyword.

到目前为止,我已经看到了示例,但通常一次仅针对单个关键字 例如对于 Any Contains 具有非 lambda 的 LINQ https://stackoverflow.com/questions/8511875/linq-with-non-lambda-for-any-contains

我想要的是一次性搜索主列表中的每条记录以查找我的任何关键字的任何实例。 就像是:

var newList = MainList.Where(m => m.Comments.Contains(purposes))

我更喜欢使用 lambda 语法,但如果不可能,linq 也可以。


添加了扩展方法,可以帮助生成此类谓词。用法很简单:

var newList = MainList
   .FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true)
   .ToList();

和实施:

public static class QueryableExtensions
{
    public static IQueryable<T> FilterByItems<T, TItem>(this IQueryable<T> query, IEnumerable<TItem> items,
        Expression<Func<T, TItem, bool>> filterPattern, bool isOr)
    {
        Expression predicate = null;
        foreach (var item in items)
        {
            var itemExpr = Expression.Constant(item);
            var itemCondition = ExpressionReplacer.Replace(filterPattern.Body, filterPattern.Parameters[1], itemExpr);
            if (predicate == null)
                predicate = itemCondition;
            else
            {
                predicate = Expression.MakeBinary(isOr ? ExpressionType.OrElse : ExpressionType.AndAlso, predicate,
                    itemCondition);
            }
        }

        predicate ??= Expression.Constant(false);
        var filterLambda = Expression.Lambda<Func<T, bool>>(predicate, filterPattern.Parameters[0]);

        return query.Where(filterLambda);
    }

    class ExpressionReplacer : ExpressionVisitor
    {
        readonly IDictionary<Expression, Expression> _replaceMap;

        public ExpressionReplacer(IDictionary<Expression, Expression> replaceMap)
        {
            _replaceMap = replaceMap ?? throw new ArgumentNullException(nameof(replaceMap));
        }

        public override Expression Visit(Expression exp)
        {
            if (exp != null && _replaceMap.TryGetValue(exp, out var replacement))
                return replacement;
            return base.Visit(exp);
        }

        public static Expression Replace(Expression expr, Expression toReplace, Expression toExpr)
        {
            return new ExpressionReplacer(new Dictionary<Expression, Expression> { { toReplace, toExpr } }).Visit(expr);
        }

        public static Expression Replace(Expression expr, IDictionary<Expression, Expression> replaceMap)
        {
            return new ExpressionReplacer(replaceMap).Visit(expr);
        }

        public static Expression GetBody(LambdaExpression lambda, params Expression[] toReplace)
        {
            if (lambda.Parameters.Count != toReplace.Length)
                throw new InvalidOperationException();

            return new ExpressionReplacer(Enumerable.Range(0, lambda.Parameters.Count)
                .ToDictionary(i => (Expression) lambda.Parameters[i], i => toReplace[i])).Visit(lambda.Body);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lambda/Linq 包含多个关键字的条件 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C++ 代码中转换字符串

    我正在学习 C 并开发一个项目来练习 但现在我想在代码中转换一个变量 字符串 就像这样 用户有一个包含 C 代码的文件 但我希望我的程序读取该文件并插入将其写入代码中 如下所示 include
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 保证复制省略是否适用于函数参数?

    如果我理解正确的话 从 C 17 开始 这段代码现在要求不进行任何复制 Foo myfunc void return Foo auto foo myfunc no copy 函数参数也是如此吗 下面的代码中的副本会被优化掉吗 Foo myf
  • 条件类型定义

    如果我有一小段这样的代码 template
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其

随机推荐

  • 我不知道为什么这个画布是空的

    因此 我一直在研究如何用其他图像填充画布的几个示例 一旦我稍微重新排列代码 它们就会停止工作 我注意到画布上的一些行为与其他类型的 JavaScript 变量相比没有意义 我想知道发生了什么 例如 如果我做这样的事情
  • 在python中读取标头之间的文件

    我有一个大文本文件 其中的值由以 开头的标题分隔 如果条件与标头中的条件匹配 我想读取文件直到下一个标头 并跳过文件的其余部分 为了测试我正在尝试读取以下名为 test234 txt 的文本文件 abcdefgh 1fnrnf mrkfr
  • 我可以在 Play Framework 上的模板/视图中调用会话吗

    我是 Play Framework 2 0 的新手 我使用的是 Scala 并且有一个关于会话的问题 我有 Ruby on Rails 背景 因此我倾向于将在 Play Framework 中学到的所有内容都与 Ruby on Rails
  • 新的 Facebook API 3.0。和 ActionBarSherlock 兼容性

    我正在阅读 facebook Android API 3 0 文档 我不明白会话与后台活动有什么关系 在所有示例中 我都应该扩展 FacebookFragment 好吧 如果我的整个应用程序不扩展 SherlockFragment 那就太好
  • 将模块内的所有函数和类导入到 python 类中

    我正在尝试将子文件夹中的所有对象导入到 python 3 8 中的类中 并且正在努力寻找一种方法来执行此操作 我不想手动导入所有对象 因为要列出的文件太多 class Foo from bar import one two three 当我
  • Once_flag 可以移动吗?

    这是怎么回事 标准没有提到once flag的可移动性 我希望应用与 std mutex 相同的参数 至少对于 gcc 4 8 版 来说 移动似乎被禁用了 如果某个编译器允许移动 那么最终可能会得到不可移植的代码 概要是 30 4 thre
  • ASP.NET MVC 3 Razor 性能

    重要更新 请参阅底部的更新 5 asp net mvc 3 中没有性能问题 这是基准问题 我在 asp net mvc2 3 aspx 和 3 razor 中制作了一个简单的 hello world 项目并对它们进行了基准测试 我看到的是
  • 如何在 Windows 上安装 OpenJPEG 并将其与 Pillow 一起使用?

    我想使用Python Pillow库将16位灰度数组保存在jp2 JPEG 2000 格式 我在尝试在 Windows 计算机上安装所需的 OpenJPEG 库时遇到了困难 这文档 https github com uclouvain op
  • 调用非托管函数,该函数采用指向指针参数的指针

    我正在尝试从我的 Net Core 应用程序调用 C 中的函数 深入了解一下 C 函数来自libmpv 渲染 h https github com mpv player mpv blob master libmpv render h函数的头
  • 如何为给定的 JavaScript 生成调用图? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我见过 https stackoverflow com questions 1385335 how to generate funct
  • 显示名称而不是电子邮件的电子邮件标题的格式是什么?

    我正在尝试创建一个 php 脚本 该脚本将使用 mySQL 数据库为我处理邮件列表 并且我已经准备好了大部分内容 不幸的是 我似乎无法让标题正常工作 而且我不确定问题是什么 headers From email protected cdn
  • Julia 中的 ifelse 和三元运算符有什么区别?

    假设我有这样的代码 cond true a cond 1 2 b ifelse cond 1 2 两种操作有什么区别 在你写的例子中 没有任何有效的区别 但是 如果这两个分支比简单的整数字面更复杂 则存在差异 julia gt f prin
  • 适用于 Android 的 OpenGL ES 工具

    在哪里可以找到用于在 OpenGL ES 中设计复杂对象的所有工具 像正方形 立方体 球体等 只需对对象进行建模并将其导出为 OBJ 文件 然后即可将 OBJ 文件加载到场景中 这是我编写的用于加载 OBJ 文件的代码 我将它们从 Maya
  • 无法删除 Kubernetes 中的所有 Pod - 清除/重启 Kubernetes

    我正在尝试删除 删除我的环境中运行的所有 Pod 当我发出 码头工人 我得到以下输出 这是一个示例屏幕截图 可以看到 都是K8 我想删除所有 Pod 删除它们 我尝试了以下所有方法 但它们不断出现 sudo kubectl delete a
  • std::async 是如何实现的?

    我想知道使用它有多合适std async在面向性能的代码中 具体来说 从工作线程捕获异常到主线程是否有任何惩罚 如何从worker返回到main的值 ref 传递的输入参数实际上永远不会被复制吗 我计划将一个繁重的会话对象传递给线程或写入s
  • kafka 和 kafka-client 有什么区别?

    我发现maven仓库里有几个kafka apache的maven仓库中有两个kafka https mvnrepository com artifact org apache kafka kafka https mvnrepository
  • 在Android中安排重复任务

    我正在设计一个应用程序 只要该应用程序位于前台 该应用程序就会重复执行将状态发送到专用服务器的任务 在我在网络上的搜索中 我看到了几种不同的方法 并想知道最好的方法是什么 安排服务器调用的最佳方式是什么 我看到的选项是 Timer http
  • GitHub 中未经验证的提交

    在我的 GitHub 存储库中 我有一个分支 其中有一些未经验证的提交 有什么办法可以将它们更改为已验证吗 未经验证意味着您的签名是错误的 如果您提交时使用了错误的电子邮件 密码 如果您尚未在 GitHub 上 在该帐户上 上传签名 或者上
  • Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

    我目前正在学习有关在 Spring Boot Web 应用程序中实现 JDBC 和使用数据库的更多信息 并且我遇到了在帖子底部编写的以下堆栈跟踪 我创建了一个简单的 Employee 模型 并且尝试在 main 所在的同一个类上执行一些数据
  • Lambda/Linq 包含多个关键字的条件

    我必须列出 带有评论字段的主列表 要搜索的关键字列表 我想搜索每条记录的每个注释字段中的关键字 在 SQL 中如下所示 select from MainList where Comment like keyword1 or Comment