#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();