Если пользователь ищет OConnors, как получить Niall O'Connors и Niall OConnors?

В SQL Server 2008 R2 у меня есть контакты с апострофом в именах.

Из приложения ASP.NET MVC 3 + Entity Framework 5, если пользователь ищет «OConnors», я хотел бы показать «O'Connors» также вместе с другими «OConnors», если таковые имеются.

var predicate = PredicateBuilder.True<Contact>();

if (!string.IsNullOrWhiteSpace(firstName.Trim()))
{
    predicate = predicate.And(p => p.FirstName.Contains(firstName) 
        || SqlFunctions.SoundCode(firstName) == SqlFunctions.SoundCode(p.FirstName));
}

if (!string.IsNullOrWhiteSpace(lastName.Trim()))
{
    predicate = predicate.And(p => p.LastName.Contains(lastName) 
        || SqlFunctions.SoundCode(lastName) == SqlFunctions.SoundCode(p.LastName));
}

contacts = context.Contacts
    .Where(predicate)
    .Where(contact=> locationIds.Contains(contact.LocationId));

Приведенный выше код выберет «Найл О'Коннорс», только если пользователь ищет «О'Коннорс».

я пытался

char[] charsToTrim = { '\'' };

predicate = predicate.And(p => p.FirstName.Trim(charsToTrim).Contains(firstName));

но получил эту ошибку: «LINQ to Entities не распознает метод System.String Trim (Char [])», и этот метод не может быть преобразован в выражение хранилища».

(SoundCode также используется для отображения вариантов имени.)


person Vipin Hari    schedule 05.03.2014    source источник


Ответы (1)


Вы должны изменить Trim(char[]) на метод замены:

predicate = predicate.And(p => p.FirstName.Replace("'", "").Contains(firstName));

Метод Replace можно преобразовать в SQL, а метод Trim(char[]) — нет.

person Bruno V    schedule 05.03.2014