匹配字段中的多个项目

时间:2013-03-28 20:59:46

标签: c# linq

我正在尝试使用linq创建有效的搜索

用户输入他们的搜索关键字(或前几个字符),然后将其解析为数组。

对于第一部分,我想找到搜索字段的实例,其中找到了所有单词。 (后来,我搜索任何,但那部分工作)

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = from c in CodeList
            where arSearchString.All(val => c.Description.StartsWith(val) || 
                                            c.Description.Contains(" " + val))
            select c;

这不会返回任何内容。

我想要发生的是返回在描述字段中找到数组中所有单词的项目 例如,如果他们输入“猫狗”,我应该回复:

"A Cat and a Dog"
"Dogs and Cats"
"Catatonic Dogma"

但不是只匹配其中一个键的项目(例如,“我的生命就是狗”)

有人能发现我做错了或提供解决方案吗?

2 个答案:

答案 0 :(得分:5)

确保考虑套管。使用ToUpper作为字符串比较优化的。 编辑:我已经ToUpperInvariant去了文化安全:)

试试这个:

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = from c in CodeList
        where arSearchString.All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) || 
                                 c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant()))
        select c;

但我真的很想把它转换为链接,因为它有点凌乱。我更喜欢这个,但你可以选择:

string[] arSearchString = searchString.Split(',', ' ', ';');
var codes = CodeList
    .Where(c => arSearchString
        .All(val => c.Description.ToUpperInvariant().StartsWith(val.ToUpperInvariant()) 
            || c.Description.ToUpperInvariant().Contains(" " + val.ToUpperInvariant())))

答案 1 :(得分:1)

查询将区分大小写,因此,在您的示例中,您不会仅仅因为搜索cat但与Cat不匹配而得到任何结果。尝试将搜索字符串和比较转换为.ToUpper().ToLower()