[英]using linq to find if a text field contains any string in a list
我在 asp.net 核心 v3.1 中运行它
我的问题类似于这个问题:
如何使用 Linq 检查字符串列表是否包含列表中的任何字符串
与与第一个答案有关的具体问题,使得
filterTags = ["abc", "cd", "efg"]
var results = db.People
.Where(p => filterTags.Any(tag => p.Tags.Contains(tag)));
所以基本上说
给我所有人数据库的结果
谁的标签字段包含任何 filterTags
其中标签 = 由一堆空格分隔的标签填充的大文本字段
这看起来很简单(尤其是因为之前已经写过)
但我得到一个错误
System.InvalidOperationException:无法翻译 LINQ 表达式“DbSet.Where(p => __filterTags_0.Any(tag => p.Tags.Contains(tag)))”。 以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估
有谁知道这意味着什么或我做错了什么?
这对于纯 EF LINQ 是不可能的。 您必须创建帮助程序来转换表达式树中的搜索列表。
public static class QueryExtensions
{
private static MethodInfo _containsMethodInfo = typeof(string).GetMethod("Contains")!;
public static IQueryable<T> FilterUsingContains<T>(this IQueryable<T> query, Expression<Func<T, string>> prop, IList<string> items)
{
if (items.Count == 0)
return query.Where(e => 1 == 2);
var param = prop.Parameters[0];
var predicate = items.Select(i =>
(Expression)Expression.Call(prop.Body, _containsMethodInfo, Expression.Constant(i, typeof(string))))
.Aggregate(Expression.OrElse);
var lambda = Expression.Lambda<Func<T, bool>>(predicate, param);
return query.Where(lambda);
}
}
然后你可以在你的查询中使用这个扩展
filterTags = ["abc", "cd", "efg"]
var results = db.People
.Where(p => p.Tags.AsQueryable().FilterUsingContains(t => t, filterTags).Any());
这是一个解决方法:
using System.Linq;
string[] filterTags = {"abc", "cd", "efg"};
var results = db.People.Where(p => filterTags.Contains(p.Tags)).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.