Неожиданное поведение от метода Linq к EF4 Contains - PullRequest
0 голосов
/ 19 марта 2011

В запросе людей этот оператор должен возвращать ряд результатов, в имени которых есть «И», -

 var results = repository.GetQuery().Where(p => p.Names
                                    .Select(n=> n.LastName)
                                    .Contains("And");

. Результаты не возвращаются.Если мы изменим его на -

var results = repository.GetQuery().Where(p => p.Names
                                   .Select(n=> n.LastName)
                                   .Contains("Anderson");

Мы получим всех людей с фамилией Андерсона.

Очевидно, что он переводится в SQL как Равные, а не как.Кроме того, мы изменили его на: -

var results = repository.GetQuery().Where(p => p.Names
                                   .Select(n=> n.LastName)
                                   .FirstOrDefault()
                                   .Contains("And");

, который возвращает всех людей, у которых есть "И" где-нибудь в этой фамилии, к сожалению, он проверяет только первую фамилию человека.

var results = repository.GetQuery().Where(p => p.Names
                                   .Any(n=> n.LastName
                                   .Contains("And"));

Работает правильно, но мы не можем использовать это так, как нам хотелось бы.

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Я так долго работал над проблемой динамического поиска ... Я не мог видеть лес сквозь деревья.

Это не работает, потому что это метод IEnumerable.Contains, который возвращает только идеальное совпадение.

var results = repository.GetQuery().Where(p => p.Names
                                    .Select(n=> n.LastName)
                                    .Contains("And");

Это работает, потому что используется метод String.Contains.

var results = repository.GetQuery().Where(p => p.Names
                                   .Any(n=> n.LastName
                                   .Contains("And"));

Это два разных метода Содержит. Мы идем последним, работая с нашими Динамическими Поисками.

0 голосов
/ 19 марта 2011

Похоже, вы пытаетесь сделать это:

Select *
From Names
Where LastName like 'And%'

Метод .Contains () работает только с точными совпадениями. Вы можете использовать Linq to SQL и указать точный SQL, который вы ищете, но это, вероятно, будет лучше с хранимой процедурой.

Похоже, это поможет: LINQ to SQL и поиск по шаблону

...