我一直在组织一个简单的小搜索。
IEnumerable<Member> searchResults = (from m in members
where m.ScreenName.ToUpper().Contains(upperKeyword)
select m).AsEnumerable();
然后我意识到如果用户输入“keyword1 keyword2”,这个小查询将始终搜索该确切的字符串。所以,我决定我应该拆分关键字
string[] keywords = upperKeyword.split(' ');
然后我遇到了一个问题。我真的不能这样做:
IEnumerable<Member> searchResults = (from m in members
where m.ScreenName.ToUpper().Contains(keywords) // array of string
select m).AsEnumerable();
因为.Contains()
不接受数组。我怎么能做到这一点?
答案 0 :(得分:2)
试试这个(未经测试):
IEnumerable<Member> searchResults = members.ToList().Where(m => keywords.Any(k => m.Summary.Contains(k)))
修改强>
添加.ToList(),因为我认为LINQ不能将上述内容转换为SQL,因此我们必须在内存中执行此操作。
答案 1 :(得分:1)
完全匹配:
尝试与你所拥有的相反:where keywords.Contains(m.ScreenName)
供参考,Creating IN queries with LINQ-to-SQL
对于部分匹配:
string[] keywords = new[]{ ... };
var results = db.members.Where(m => keywords.Any(sn => m.ScreenName.Contains(sn)));
此处没有编译错误,但我没有要测试的数据。
答案 2 :(得分:0)
我认为您需要将数组转换为列表。我刚刚离开办公室,但我认为这应该有用。
IEnumerable<Member> searchResults = (from m in members
where keywords.ToList().Contains(m.ScreenName.ToUpper()) // array of string
select m).AsEnumerable();