2014-02-03 3 views
0

Я чувствую, что это что-то просто, и я просто не хватает его ...Использование String.Contains() через несколько столбцов в модели Ef6

нужно сделать быстрый и грязный поиск текста на FirstName и LastName столбцов вместе с моделью, как это:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

образец данных:

FirstName   LastName 
------------------------------- 
John     Appleseed 
John     Anderson 
Chris    Cringle 
George    Washington 

Backend является SQL Server, с помощью LINQ к Entities и Entity Framework 6, мне нужно сделать поиск по полному имени, но что-то вроде этого не будет работать:

var results = from p in db.Persons 
       where (p.FirstName + ' ' + p.LastName).Contains(keyword) 
       select p; 

LINQ не нравится. Это для метода автозаполнения; Я хочу, чтобы он смог найти результаты для «john a», если кто-то наберет это - это будут первые две строки из данных образца.

Как я могу это сделать?

+0

Это будет в конечном итоге сделать TSQL с 'LIKE', что означает плохую производительность. Если у вас много данных, и вам нужно это выполнить, я бы предложил создать расчетный столбец для конкатенации и создать на нем полный текстовый индекс. – Jodrell

+0

Это всего лишь пара тысяч строк. Я в порядке с заявлением LIKE. –

ответ

4

EF может только конкатентные строки; он не может контактировать с персонажами. Если бы LINQ to Objects, то char был бы преобразован в строку без каких-либо проблем, но EF просто недостаточно надежна для этого. Фиксирование достаточно тривиально; использовать буквальный строку, а не буквальный характер, для пространства:

var results = from p in db.Persons 
       where (p.FirstName + " " + p.LastName).Contains(keyword) 
       select p; 
+0

О, боже мой, вот и все. Просто изменить «на» сделал трюк. Не могу поверить, что я этого не пытался. Как я и подозревал, это было что-то простое. –

Смежные вопросы