Поиск нескольких слов с помощью linq - PullRequest
0 голосов
/ 26 октября 2011

Я пытаюсь выполнить поиск сотрудника, используя 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()

Я хотел бы найти «Отметить разработчика» и получить всех лиц с именной отметкой, у которых есть звание разработчика.

Любойideers

Ответы [ 4 ]

1 голос
/ 26 октября 2011

замените ваше условие ИЛИ || на условие И &&, чтобы получить записи, соответствующие только названию и названию (с || вы собираетесь получать все записи, которые удовлетворяют имени ИЛИ названию, а это не то, что хочешь).

при условии, что 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()
0 голосов
/ 25 июля 2012
0 голосов
/ 26 октября 2011

Сделай это наоборот.Проверьте, содержит ли ключевое слово имя / заголовок

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

0 голосов
/ 26 октября 2011

Я думаю, вы должны разбить ключевые слова на массив

 var kwords = keywords.Split(' ');

, тогда

where (kwords.Contains(e.firstname) || kwords.Contains(j.title))

, вероятно, будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...