首页 > 后端开发 > C++ > 如何使用 Lambda/LINQ 在数据库字段中高效搜索多个关键字?

如何使用 Lambda/LINQ 在数据库字段中高效搜索多个关键字?

Patricia Arquette
发布: 2025-01-21 12:09:13
原创
298 人浏览过

How to Efficiently Search for Multiple Keywords in a Database Field Using Lambda/LINQ?

Lambda/LINQ多关键词数据库字段搜索

本文介绍如何使用Lambda/LINQ表达式高效地在数据库字段(例如Comments字段)中同时搜索多个关键词。 传统的Contains方法一次只能搜索一个关键词,而本文提供的方法可以同时处理多个关键词。

使用Lambda表达式,你可以这样编写查询:

<code class="language-csharp">var newList = MainList.Where(m => m.Comments.Contains(purposes));</code>
登录后复制

然而,如果你需要搜索多个关键词,则需要更高级的技巧。为此,我们开发了一个扩展方法:

<code class="language-csharp">public static IQueryable<T> FilterByItems<T, TItem>(this IQueryable<T> query, IEnumerable<TItem> items,
    Expression<Func<T, TItem, bool>> filterPattern, bool isOr)</code>
登录后复制

这个扩展方法接收主列表MainList,关键词列表items,以及一个Lambda表达式filterPattern(用于检查关键词是否存在于Comments字段中),以及一个布尔值isOr(指定使用OR或AND运算符匹配关键词)。

例如:

<code class="language-csharp">var newList = MainList
    .FilterByItems(keywords, (m, k) => m.Comments.Contains(k), true)
    .ToList();</code>
登录后复制

此查询将返回Comments字段包含keywords列表中任意一个关键词的记录列表。

FilterByItems扩展方法的实现

FilterByItems扩展方法利用ExpressionReplacer类递归地修改表达式,以替换特定部分为所需的值。

以下是ExpressionReplacer类的实现:

<code class="language-csharp">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);
    }

    // ... (ExpressionReplacer class remains the same) ...
}</code>
登录后复制

这个改进后的描述更加清晰地解释了代码的功能和使用方法,并对关键部分进行了更详细的说明。

以上是如何使用 Lambda/LINQ 在数据库字段中高效搜索多个关键字?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板