Как разбить поисковый запрос на различные типы вопросов? - PullRequest
4 голосов
/ 03 ноября 2008

Я пишу внутреннее приложение, в котором мы позволяем пользователям выполнять несколько разных типов запросов.

Приложение позволяет пользователям осуществлять поиск в базе данных по одному из следующих ключей:

  • EmployeeID
  • имя (имя или фамилия)
  • CompanyID
  • статус (рабочий, полный, больничный, отпуск по беременности и родам и т. Д.)

Метод грубой силы состоит в том, чтобы просто создать одну веб-форму для каждого типа запроса и иметь меню, в котором пользователь выбирает тип запроса (это ASP.NET)

Но я хотел бы иметь простое текстовое поле, в котором пользователь вводит запрос, а затем приложение должно проанализировать запрос и автоматически выбрать тип запроса, который нужно отправить на сервер.

Например, employeeId - это число точного формата. Так что я могу сделать регулярное выражение, чтобы соответствовать этому. То же самое относится и к статусу, идентификатору компании и т. Д.

Так что мои вопросы, если кто-нибудь здесь может дать несколько советов о том, как лучше всего написать код на C #, который будет принимать строку и сопоставлять ее с рядом различных регулярных выражений.

Ура, Йоаким

Ответы [ 3 ]

1 голос
/ 03 ноября 2008
1 голос
/ 03 ноября 2008

Что бы я сделал, это всего лишь один запрос ИЛИ:

select * from employee where employeeId = search OR name like "%search%" OR status = "search"
1 голос
/ 03 ноября 2008

Прямой способ состоит в том, чтобы иметь последовательность if операторов, проверяющих каждое регулярное выражение по очереди:

if (Regex.Match(query, regex1)) {
    HandleFirstCase(query);
} else if(Regex.Match(query, regex2)) {
    HandleSecondCase(query);
} ... 
else {
    HandleFullTextSearch();
}

Более сложным способом был бы подход, основанный на данных, где вы сохраняете регулярные выражения и действия в таблице и перебираете их:

public class RegexAction {
    public Regex Pattern { get; private set; }
    public Action<string> Handler { get; private set; }
    public RegexAction(Regex pattern, Action<string> handler) {
        this.Pattern = pattern;
        this.Handler = handler;
    }
}

public static RegexAction[] HandlerTable = new RegexAction[] {
    new RegexAction(regex1, HandleFirstCase),
    new RegexAction(regex2, HandleSecondCase),
    new RegexAction(regex3, HandleThirdCase),
    // ...
}

foreach(RegexAction action in HandlerTable) {
    if (action.Match(query)) {
        action.Handler(query);
        break;
    }
}

Это помогает отделить важные данные, шаблоны и действия от реализации тестирования и вызова.

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