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中文网其他相关文章!