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

时间:2012-08-29 22:35:17

标签: linq list search lambda contains

我需要一个Linq语句,它将从一个表中选择所有字段,其中一个字段包含列表中的所有元素,而不管单词搜索整个字符串的其他字段

它基本上只是一个包含在内的单词搜索字段,其中所有单词都需要在记录中,字符串搜索其他字段

即我有一个查找屏幕,允许用户搜索整个搜索字符串的AccountID或详细信息,或搜索clientID中包含单词的单词,如果我可以找出ClientId组件,则将其展开到详细信息字段

复杂的是,正在搜索AccountId和Detail,这基本上阻止了我在第二个例子中做了foreach,因为“ors”

示例1,当我在之后执行query.Count()时,这会给我一个以下错误

query.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”,“微软”,“我们喜欢Mircosoft”

搜索exmaples

searchStr =“232” 返回记录1;

searchStr =“bobo hair” 不返回任何记录

searchStr =“bobo and” 返回记录1

searchStr =“123 bobo and” 返回什么都不返回

这里的想法是 如果客户输入部分AccountId,则返回东西, 如果客户想要搜索ClientId,他们可以通过搜索词来键入和取消客户端,即单词列表。由于客户端数量众多,ClientID需要包含所有单词(按任意顺序)

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

1 个答案:

答案 0 :(得分: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一样。