2

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

它基本上只是对所有单词都需要在记录中的字段进行包容性单词搜索,并在其他字段上进行字符串搜索。

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

复杂性在于,AccountId 和 Detail 也在被搜索中,这基本上阻止了我在第二个示例中执行 foreach,因为“or”。

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

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

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

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,这给了我任何搜索词类型的结果:

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”、“此客户 suxs”

2、“654355”、“Jesses hair”、“我们喜欢这个客户之类的东西”

3、《456455》、《微软》、《我们爱微软》

搜索示例

searchStr = "232" 返回记录 1;

searchStr = "bobo hair" 不返回任何记录

searchStr = "bobo and" 返回记录 1

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

这里的想法是:

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

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

4

1 回答 1

1

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

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

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

另一种是不要All在您的查询中使用:

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两个查询之间的一个。

于 2012-08-30T00:17:23.820 回答