2017-02-02 4 views
-1

Мне удалось создать мое первое веб-приложение MVC 5 с функциональностью CRUD.LINQ Содержит странное поведение

У моих данных есть несколько способов поиска записей, но один из них, похоже, не делает того, что я ожидаю от него. Вот мой контроллер код Поисковый запрос:

query = query.Where(c => 
     c.PostCode.Contains(searchString) 
     || c.Place1.Select(e => e.PostCode).Contains(searchString) 

Вот моя модель:

public Place() 
    { 
     Place1 = new HashSet<Place>(); 
    } 

    [Display(Name = "Postcode")] 
    public string PostCode { get; set; } 

    public virtual ICollection<Place> Place1 { get; set; } 

Мои отношения базы данных является таблица ссылок самостоятельно -> 1 до 0, следовательно, то же имя для полей.

Может ли кто-нибудь объяснить мне, почему функция поиска принесет ожидаемые результаты при поиске полного значения «NR32 4TW» для обеих частей кода, но только первая часть запроса (до OR оператора) поиска найдет если я сделаю частичный поиск, используя «NR32 4T»?

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

TDLR; LINQ ".Contains()" не выполняет поиск частей строки при ее использовании в коллекции в рамках модели. Может ли кто-нибудь объяснить это поведение?

+1

LINQ - это интерфейс. Вы используете Entity Framework? Это то, что реализует интерфейс LINQ. –

+0

Вы смешиваете 'Enumerable.Contains' с' string.Contains'. Второй критерий должен быть «c.Practice1.Any (e => e.PostCode.Содержит (SearchString)) '. –

ответ

5

не принимая во внимание, что у вас есть разница .... ОПЫТ1 и Place1

вы используете 2 разные функции с именем «Содержит»

c.PostCode.Contains(searchString) 

это String.Contains(string) .. . это выглядит для параметра в строке вы вызываете его на ...

c.Practice1.Select(e => e.PostCode).Contains(searchString) 

это IEnumerable<string>.Contains(string) ... он ищет строку в перечисление строк ...

, что вы хотели сделать, это, скорее всего, это:

c.PostCode.Contains(searchString) || c.Practice1.Any(e => e.PostCode.Contains(searchString)) 
+0

Я сделал корректировку кода чтобы отразить ваш комментарий в первой строке. Отличный ответ, спасибо! – Newseek

1

Enumerable.Contains() выполняет поиск последовательности (списка), чтобы узнать, находится ли в ней точное значение. Это не поиск текста.

+0

PostCode - это строка. Если его EF, то Содержит вызов, следует перевести в LIKE –

+1

@SergeyBerezovskiy Если вы вызываете 'Contains' на' string', то да, вы спрашиваете, содержит ли эта строка подстроку. Если вы вызываете 'Contains' * на набор значений *, вы спрашиваете, установлено ли значение в наборе, а не в качестве значения подстроки значения в наборе. – Servy

+2

@SergeyBerezovskiy И именно поэтому он сказал, что он отлично работает для первой части OR, но не второй. Вторая часть представляет собой последовательность: 'c.Place1.Select (e => e.PostCode) .Contains (searchString)' –

1

Вы хотите искать строковые значения каждого PostCode для частично, ваш код, однако, ищет список почтовых кодов для полного значения поиска. Разница заключается в том, где вы кладете свои закрывающие скобки.

c.Practice1.Select(e => e.PostCode).Contains(searchString) 

против

c.Practice1.Select(e => e.PostCode.Contains(searchString)) 

С помощью последнего проходит через строку каждого PostCode и соответствует эта строка содержит searchString, бывший выбирает все PostCode ей потом смотрит на матч в этом списке почтовых кодов до точного searchString.

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

  • Нет связанных вопросов^_^