使用linq搜索多个单词
本文关键字:单词 搜索 linq 使用 | 更新日期: 2023-09-27 18:12:30
我正在尝试使用linq搜索员工。我想要能够搜索多个搜索词(名、姓)我发现一些可以做到这一点,如果我只在一个DB表中搜索,但我的问题是,我在一些连接表中搜索。
下面的例子
list<employee> list = from(e in dbContext.getTable<employee>
join dbContext.GetTable<job>() on e.jobi equeals j.id
where e.firstname.contains(keywords) || j.title.contains(keywords))
select e).toList()
我想搜索"Mark developer",并获得所有被命名为Mark的人,其职位名称为developer。
任何ideers将您的OR条件||
替换为AND条件&&
,以检索仅匹配标题和名称的记录(使用||
,您将获取满足名称或标题的每条记录,这不是您想要的)。
假设keywords
是类似string
的
string keywords = "Mark Developer"; // "<name> <title>"
你的查询应该工作,如果修改如下
list<employee> list = from(e in dbContext.getTable<employee>
join dbContext.GetTable<job>() on e.jobi equeals j.id
where (e.firstname.contains(keywords.split(' ')[0]) && (j.title.contains(keywords.split(' ')[1])))
select e).toList()
如果大写/小写/混合大小写是一个问题,您可能需要像
这样的内容list<employee> list = from(e in dbContext.getTable<employee>
join dbContext.GetTable<job>() on e.jobi equeals j.id
where (e.firstname.ToLower().contains(keywords.split(' ')[0].ToLower()) && (j.title.ToLower().contains(keywords.split(' ')[1].ToLower())))
select e).toList()
我认为你应该把关键字分成一个数组
var kwords = keywords.Split(' ');
然后where (kwords.Contains(e.firstname) || kwords.Contains(j.title))
可能可以
反过来做。检查关键字是否包含名称/标题
var keys = keywords = keywords.Split(' ');
list<employee> list = from(e in dbContext.getTable<employee>
join dbContext.GetTable<job>() on e.jobi equeals j.id
where keys.Contains(e.firstname) || keys.contains(j.title)
select e).toList();
编辑如果你还想处理有多个名字的人,那么:
var keys = keywords = keywords.Split(' ');
list<employee> list = from(e in dbContext.getTable<employee>
join dbContext.GetTable<job>() on e.jobi equeals j.id
where keys.Any(k=>e.firstname.Contains(k))
|| keys.Any(k=> j.title.Contains(k))
select e).toList();
然而,我不觉得有信心,这可以翻译成SQL,但因为你还没有标记你的问题与linq-2-sql或EF,这可能不是一个问题(虽然从你的代码看来,EF标签可能是缺失的)
编辑如果您希望能够动态地构建查询(您的评论建议),我建议您看看动态LINQ
完美解决方案
http://briancaos.wordpress.com/2011/02/16/simple-string-keyword-search-using-extensionmethods-and-linq/