我正在尝试使用linq搜索员工。 我希望能够搜索多个搜索词(名字姓氏) 如果我只搜索一个数据库表,我发现一些可以做到这一点,但我的问题是我在一些连接表中搜索。
以下示例
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开发人员”,并让所有名为mark的人都有一个职位名称开发人员。
任何想法者
答案 0 :(得分:1)
将AND条件||
替换为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()
答案 1 :(得分:0)
我认为您应该将关键字拆分为数组
var kwords = keywords.Split(' ');
然后
where (kwords.Contains(e.firstname) || kwords.Contains(j.title))
可能会起作用
答案 2 :(得分:0)
反过来做。检查关键字是否包含名称/标题
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标签)
修改强> 如果您希望能够动态构建查询(您的意见建议),我建议您查看Dynamic LINQ
答案 3 :(得分:-1)