繁体   English   中英

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

[英]Check if text contains any string item from list of string 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);

这给了我错误:

除包含运算符外,不能在查询运算符的LINQ to SQL实现中使用局部序列。

我不能使用filterArr.Contains(x.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”,则在“名称”(数据库列)中有“ Alex Hales”。 users查询将返回用户“ Alex Hales”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM