LINQ Lambda从表中选择所有,其中字段包含列表中的所有元素

LINQ Lamba Select all from table where field contains all elements in list

我需要一个 Linq 语句,该语句将从一个字段包含 list<String> 中所有元素的表中选择所有元素,同时在其他字段中搜索整个字符串而不考虑单词。

它基本上只是一个包含所有词的字段的词搜索和其他字段的字符串搜索。

即我有一个查找屏幕,允许用户搜索 AccountID 或 Detail 以获取整个搜索字符串,或者搜索 clientID 以获取包含单词的单词,如果我能找出 ClientId 组件,我会将其扩展到详细信息字段。

复杂的是 AccountId 和 Detail 也正在被搜索,这基本上阻止了我在第二个例子中执行 foreach 由于"or"。

示例 1,当我之后执行 query.Count() 时,这给了我以下错误:

query.Count(); 'query.Count()' 抛出了一个类型为 'System.NotSupportedException' 的异常 int {System.NotSupportedException}

base {"本地序列不能在查询运算符的 LINQ to SQL 实现中使用,但包含运算符除外。"} System.SystemException {System.NotSupportedException}

1
2
3
var StrList = searchStr.Split(' ').ToList();

query = query.Where(p => p.AccountID.Contains(searchStr) || StrList.All(x => p.clientID.Contains(x)) || p.Detail.Contains(searchStr));

示例 2,这给了我任何搜索词类型的结果:

1
2
3
var StrList = searchStr.Split(' ').ToList();
  foreach (var item in StrList)
    query = query.Where(p => p.AccountID.Contains(searchStr) || p.clientID.Contains(item) || p.Detail.Contains(searchStr));

更新

我有一个包含 3 个字段的表,AccountID、ClientId、Details

记录
Id、AccountID、CLientId、详细信息

1,"123223","bobo and co","this client suxs"

2,"654355","Jesses hair","我们喜欢这个客户之类的东西"

3、"456455"、"微软"、"我们爱微软"

搜索示例

searchStr ="232"
返回记录 1;

searchStr ="波波头发"
不返回记录

searchStr ="bobo and"
返回记录 1

searchStr ="123 bobo and"
返回什么都不返回

这里的想法是:

  • 如果客户端输入部分 AccountId 它将返回内容,
  • 如果客户想要搜索 ClientId,他们可以通过搜索词(即单词列表)键入和取消客户。由于客户端数量众多,ClientID 需要包含所有单词(以任何顺序)

我知道这看起来很奇怪,但它只是一个以强大的方式查找帐户的简单界面。


我认为您的问题有两种解决方案。

一种是这样计算内存中的结果:

1
int count = query.ToList().Count();

另一个是不要在查询中使用 All

1
2
3
4
5
6
var query2 = query;
foreach (var item in StrList)
{
    query2 = query2.Where(p => p.clientID.Contains(item));
}
var result = query2.Union(query.Where(p => p.AccountID.Contains(searchStr) || p.Detail.Contains(searchStr)));

末尾的 Union 就像两个查询之间的 OR