我正在按用户名过滤后获取用户列表。
查询:
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)
,它将不会给我结果。
任何帮助将不胜感激。
答案 0 :(得分:1)
我不确定是否可以在这样的单语句中做到这一点。太差了,解析能力太差了。
但是,您可以获取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%")
希望这对您有帮助...
答案 1 :(得分:0)
我认为您可以做类似的事情
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”。