检查文本是否包含字符串列表中的任何字符串项 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);
这给了我错误:
Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
我不能使用 filterArr.Contains(x.Name)
,因为姓名列同时包含名字和姓氏。就像上面的列表一样,它们是一个项目 "alex",我在名称列中组合了一个名称 "Alex Hales"。所以如果我使用 filterArr.Contains(x.Name)
它不会给我结果。
任何帮助将不胜感激。
我想你可以这样做
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
查询将 return 用户 "Alex Hales".
我不确定在这样的 单个 语句中是否可行。对于糟糕的解析内容来说太复杂了。
但是,您可以获得一个 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= (from u in DbContext.Users
where filterArr.Any(y=> u.Name.Contains(y)) select u);
这给了我错误:
Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator.
我不能使用 filterArr.Contains(x.Name)
,因为姓名列同时包含名字和姓氏。就像上面的列表一样,它们是一个项目 "alex",我在名称列中组合了一个名称 "Alex Hales"。所以如果我使用 filterArr.Contains(x.Name)
它不会给我结果。
任何帮助将不胜感激。
我想你可以这样做
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
查询将 return 用户 "Alex Hales".
我不确定在这样的 单个 语句中是否可行。对于糟糕的解析内容来说太复杂了。
但是,您可以获得一个 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%")
希望这对您有所帮助...