如何解决如何使用Linq检查字符串是否包含字符串的子集之一
在某些情况下,允许用户在搜索用户名时提供一组关键字(更确切地说是子字符串)。
我有类似的东西
// this set of strings should find names such as john,mary or smith
List<string> searchStrings=new List<string>(){"jo","ma","th"};
// LINQ query looks like this
var filteredPatients=allPatients.Where(p =>
(searchStrings.Any(s=>p.Name.ToLower().Contains(s)));
但是这失败并给出异常:
System.AggregateException:发生一个或多个错误。 (无法翻译LINQ表达式。要么以可以翻译的形式重写查询,要么通过插入对AsEnumerable(),AsAsyncEnumerable(),ToList()或ToListAsync()的调用来显式切换到客户端评估。 / p>
这是针对entityFramework,针对Postgres Db的.NET Core 3.1运行的
还有另一种写此查询以产生所需结果的方法吗?
注意:可以在allPaitents上调用ToList()或ToArray(),但我想避免这种情况,因为整个(很大)的表都将读入内存。
解决方法
对于初学者来说,您需要一个PredicateBuilder,它将允许您将表达式组合在一起。
使用它,您可以只创建一个谓词来分别搜索每个搜索字符串,然后将这些谓词或在一起。
List<string> searchStrings = new List<string>() { "jo","ma","th" };
var predicate = searchStrings.Select<string,Expression<Func<Patient,bool>>>(search => patient => patient.Name.ToLower().Contains(search))
.DefaultIfEmpty(patient => false) //or whatever else you want to do if there are no search strings
.Aggregate(PredicateBuilder.Or);
var filteredPatients = allPatients.Where(predicate);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。