我正在尝试使用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"
但不是只匹配其中一个键的项目(例如,“我的生命就是狗”)
有人能发现我做错了或提供解决方案吗?
答案 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()