Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用linq查找文本字段是否包含列表中的任何字符串_Linq_Asp.net Core_Contains_Any - Fatal编程技术网

使用linq查找文本字段是否包含列表中的任何字符串

使用linq查找文本字段是否包含列表中的任何字符串,linq,asp.net-core,contains,any,Linq,Asp.net Core,Contains,Any,我在asp.NETCoreV3.1中运行这个 我的问题类似于这个问题: 与第一个答案相关的具体问题如下: filterTags = ["abc", "cd", "efg"] var results = db.People .Where(p => filterTags.Any(tag => p.Tags.Contains(tag))); 所以基本上说 给我所有人的数据库结果 “谁的标签”字段

我在asp.NETCoreV3.1中运行这个

我的问题类似于这个问题:

与第一个答案相关的具体问题如下:

filterTags = ["abc", "cd", "efg"]
var results = db.People
                .Where(p => filterTags.Any(tag => p.Tags.Contains(tag)));
所以基本上说
给我所有人的数据库结果
“谁的标签”字段包含任何过滤器标签
其中Tags=由一组空格分隔的标记填充的大文本字段

这似乎很简单(尤其是以前写过这篇文章)
但我得到了一个错误

System.InvalidOperationException:LINQ表达式“DbSet” .其中(p=>\uu过滤器标记0 .Any(tag=>p.Tags.Contains(tag)))无法翻译。以可以翻译的形式重写查询,或者通过插入对AsEnumerable()、AsAsAsAsyncEnumerable()、ToList()或ToListSync()的调用显式切换到客户端计算


有人知道这意味着什么或我做错了什么吗?

这里有一个解决方法:

using System.Linq; 

string[] filterTags = {"abc", "cd", "efg"};
var results = db.People.Where(p => filterTags.Contains(p.Tags)).ToList();

这在纯EF LINQ中是不可能的。您必须创建一个助手来转换表达式树中的搜索列表

公共静态类查询扩展
{
私有静态方法信息(containsMethodInfo=typeof(string).GetMethod(“Contains”)!;
公共静态IQueryable筛选器包含(此IQueryable查询、表达式属性、IList项)
{
如果(items.Count==0)
返回query.Where(e=>1==2);
var param=属性参数[0];
变量谓词=项。选择(i=>
(Expression)Expression.Call(prop.Body,_containsMethodInfo,Expression.Constant(i,typeof(string)))
.聚合(表示为OrElse);
var lambda=表达式.lambda(谓词,参数);
返回查询.Where(lambda);
}
}
然后可以在查询中使用此扩展

filterTags=[“abc”、“cd”、“efg”]
var results=db.People
.Where(p=>p.Tags.AsQueryable().FilterSingContains(t=>t,filterTags.Any());

您检查过这个吗@TAHASULTANTEMURI-intersect用于两个列表,而我专门查找一个列表中的任何内容,以显示在长字符串中的某个位置。我指的是下一个列表,您应该使用var People=_db.People.Where(p=>p.Tagse.Split(',').ToList().Any(x=>filterTags.Contains(x));执行以下代码:
list filterTags=new list{“abc”,“cd”,“efg”};var results=db.People.ToList()。其中(p=>filterTags.Any(tag=>p.Tags.Contains(tag))).ToList()
Yinqiu:你的解决方案将把成千上万的人从数据库转移到你的本地进程,然后扔掉他们中的大部分。你的代码不会编译。
p.Tags
显然是一个
列表
。你把它当作一个
字符串
@Enigmativity你犯了一个错误。请仔细看看这个问题。上面写着“Tags=由一堆空格分隔的标记填充的大文本字段”,因此标记是一个字符串。
IEnumerable.Contains
不会重载一个lambda。您的代码仍然没有编译。@Enigmativity我要说的是,您没有准确阅读问题。问题提到在解决方法中必须考虑使用Linq。因此使用Linq字符串数组可以应用Contains me方法。也许你应该测试你的代码,
IEnumerable.Contains
方法没有带lambda的重载。你的代码不会编译。