9

私は次のような声明を持っています:

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

4 に答える 4

17

試してくださいIndexOf

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

これが機能しない理由はContains、 an を受け入れる拡張メソッドが、 ではなくを実装IEqualityComparer<TSource>する a で動作しているため、 aと anを渡すことができないためです。StringIEnumerable<char>IEnumerable<string>stringIEqualityComparer<string>

于 2012-09-10T00:06:08.400 に答える
3

Contains(source, item, comparer)メソッドがあっても、比較子はコードであり、NH が変換できる式ツリーではないため、NHibernate でそれを使用することはできません*。

*: つまり、比較子の特別なケースの生成を行う LINQ プロバイダー拡張機能を作成しない限り、そうではありません。

于 2012-09-10T00:19:33.137 に答える
2

使用している .Contains は LINQ からのものです。文字列を と見なすため、.Contains が必要IEnumerable<char>ですIEqualityComparer<char>StringComparer比較子は を実装しますIEqualityComparer<String>

ミニテックのIndexOf方法がうまくいくなら、それが一番楽だと思います。

于 2012-09-10T00:21:48.437 に答える