'string' не содержит определения для 'Contains'

у меня есть такое заявление:

var vals =
    from StandAloneUserPayment saup in _Session.Query<StandAloneUserPayment>()
        .Fetch(x => x.RecurringPayments)
    where
        saup.User.UserId == userId
        && searchString.Contains(saup.FriendlyName, StringComparer.InvariantCultureIgnoreCase)
    select
        saup;

Это, кажется, именно то, что я должен делать, но я получаю всю строку с Contains метод подчеркнут следующим сообщением:

string не содержит определения для Contains и лучший метод расширения перегрузки System.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>) имеет некоторые недопустимые аргументы

что я делаю не так?

4 ответов


попробовать IndexOf:

searchString.IndexOf(saup.FriendlyName,
                     StringComparison.InvariantCultureIgnoreCase) != -1

почему это не работает, потому что Contains метод расширения, который принимает IEqualityComparer<TSource> работает на String, который реализует IEnumerable<char>, а не IEnumerable<string>, так что string и IEqualityComparer<string> не может быть передан ему.


даже если есть содержит(источник, элемент, компаратор) метод, вы не можете * использовать это с NHibernate, так как компараторы-это код, а не деревья выражений, которые NH может перевести.

*: то есть, если вы не напишете расширение поставщика LINQ, которое генерирует специальные случаи для вашего компаратора, но это не так.


The .Содержит, что вы используете, происходит от LINQ - он видит строку как IEnumerable<char>, поэтому он хочет IEqualityComparer<char>. The StringComparer comparers реализации IEqualityComparer<String>.

если minitech по IndexOf метод работает, я думаю, что будет самый простой способ.


добавьте следующее пространство имен в свой класс,

using System.Linq;

надеюсь, что это помогает.