动态linq-to-sql,基于多个关键字进行查询

时间:2011-01-03 22:07:50

标签: c# linq linq-to-sql

我一直在组织一个简单的小搜索。

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()不接受数组。我怎么能做到这一点?

3 个答案:

答案 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();