【问题标题】:Check if text contains any string item from list of string c# linq检查文本是否包含字符串列表中的任何字符串项 c# linq
【发布时间】:2023-03-14 01:39:01
【问题描述】:

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

查询:

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 实现中使用,但 Contains 运算符除外。

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

任何帮助将不胜感激。

【问题讨论】:

  • 1.在 .Contains() 之前制作 ToLower() (filterArr - 所有值都应该更低) filterArr.Contains(x.Name.ToLower())

标签: c# linq linq-to-sql


【解决方案1】:

我不确定这在像这样的 single 语句中是否可行。解析不好的东西太复杂了。

但是,您可以获取一个 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%")

希望这会有所帮助...

【讨论】:

  • 我正要发布我自己的解决方案。完全像这样实现。但是您已经发布了它,因此会将您的答案标记为解决方案
【解决方案2】:

我认为你可以这样做

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”。

【讨论】:

  • 你误解了我的要求。如果用户搜索了“alex”并且在名称(数据库列)中有“Alex Hales”。然后根据您的查询,用户中仍然没有项目
  • @Ahmad 更新了我的答案,现在试试吧。
猜你喜欢
  • 2014-07-08
  • 2016-01-27
  • 2021-11-26
  • 2015-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2014-08-09
  • 2020-04-15
相关资源
最近更新 更多