检查文本是否包含字符串c#linq列表中的任何字符串项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查文本是否包含字符串c#linq列表中的任何字符串项相关的知识,希望对你有一定的参考价值。

我试图在按名称过滤后获取用户列表。

查询:

string filter="alex, faheem, Cohen";
var filterArr=filter.Split(new []{','},StringSplitOptions.RemoveEmptyEntries).Select(f=>f.Trim()).ToList();

var users= (from u in DbContext.Users
                where filterArr.Any(y=> u.Name.Contains(y)) select u);

这给了我错误:

除Contains运算符外,本地序列不能用于查询运算符的LINQ to SQL实现。

我不能使用filterArr.Contains(x.Name),因为Name列包含名字和名字。就像在上面的列表中他们是一个项目“alex”,我在名称列中有一个名称“Alex Hales”。所以如果我使用filterArr.Contains(x.Name)它不会给我结果。

任何帮助都感激不尽。

答案

我不确定在这样的单一声明中这是可能的。对于糟糕的解析内容来说,这太复杂了。

但是,您可以获取IQueryable(),然后迭代过滤器将这些作为单独的WHERE子句附加,然后这些应该稍后正确添加到SQL中。

像这样的东西:

//this just gets a reference the DbSet, which implements IQueryable<User>
var queryable = _dbContext.Users;

//iterate over the filters and add each as a separate WHERE clause
foreach(var f in filters)
{
    //this just adds to the existing expression tree..
    queryable = queryable.Where(u=>u.Name.Contains(f));
}
//this will actually hit the database.
var results = queryable.ToList();

这应该在SQL中生成这样的东西(完全伪代码)

select 
  u.*
from 
  users u
where 
  (u.username like "%Sue%")
  or (u.username like "%Bob%")

希望这可以帮助...

另一答案

我想你可以做这样的事情

string filter = "alex, faheem, Cohen";
var filterArr = filter.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim()).ToList();
var users = _dbContext.Users.Where(x => filterArr.Any(n => n.Contains(x.Name))).ToList();

更新根据您的要求,查询将正常工作。

string filter = "Alex, faheem, Cohen";
var filterArr = filter.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(f => f.Trim())
            .ToList();
var users = _dbContext.Users
            .Where(x => filterArr.Any(n => x.UserName.Contains(n))).ToList();

如果用户搜索了“alex”并且在Name(数据库列)中搜索了“Alex Hales”。 users查询将返回用户“Alex Hales”。

以上是关于检查文本是否包含字符串c#linq列表中的任何字符串项的主要内容,如果未能解决你的问题,请参考以下文章

使用 LINQ 检查字符串是不是包含字符串或字符列表

用于检查字符串列表/数组中的字符串的 C# 最佳实践 (LINQ) [关闭]

如何检查字符串是不是包含列表的任何元素并获取元素的值?

我可以检查字符串中是否包含数组的元素吗?

检查字符串的第一部分是否在表中的值列表中

如何检查字符串是不是包含字符列表?