Поиск имен в базе данных, которые соответствуют целым параметрам или любой части параметров

#c# #sql #vb.net #sql-server-2008 #linq-to-sql

#c# #sql #vb.net #sql-server-2008 #linq-to-sql

Вопрос:

C # или VB.NET приветствуются.

Я пишу запрос для выбора всех записей, содержащих какую-либо часть параметра.

У меня есть одна таблица под названием Employees. У некоторых людей есть имя, подобное этому: Джон Дэвид Кларк

Если параметр равен

  • «Джон»
  • «Джон Дэвид»
  • «Дэвид Джон»
  • «Джон Кларк»
  • «Кларк Джон»

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

Если я использую функцию, содержит (q.FirstName amp; » » amp; q.LastName).Содержит(EmployeeName), я не получу никакого результата, если EmployeeName — «Джон Кларк» Функция содержит поиск только следующих слов слева направо. Это не соответствует ни одному слову за раз.

Вот почему я использовал это в Linq to SQL:

         Dim employeeName As String
        query = From q In db.Employees _
                Where (q.FirstName amp; " " amp; q.LastName).Split(CChar(" ")).Intersect(employeeName.Split(CChar(" "))).Any _
                Select q
  

Я получил следующую ошибку:

Локальная последовательность не может использоваться в реализации операторов запроса LINQ to SQL, за исключением оператора Contains()

Есть ли другой способ, которым я могу запросить FirstName и LastName, которые содержат какую-либо часть параметра?

Ответ №1:

Это позволит найти тех сотрудников, у которых имя и фамилия совпадают со строкой поиска:

         var searchText = "John David Clark";
        var tokens = searchText.Split(null);

        var result = db.Employees
            .Where(arg => tokens.Contains(arg.FirstName) amp;amp; tokens.Contains(arg.LastName))
            .Select(arg => new { arg.LastName, arg.FirstName })
            .ToList();
  

Это позволит найти тех сотрудников, фамилия или имя которых совпадают с любым именем в строке поиска:

         var searchText = "John David Clark";
        var tokens = searchText.Split(null);

        var result = db.Employees
            .Where(arg => tokens.Contains(arg.FirstName) || tokens.Contains(arg.LastName))
            .Select(arg => new { arg.LastName, arg.FirstName })
            .ToList();