'string'不包含'Contains'的定义

时间:2012-09-10 00:03:24

标签: c# linq nhibernate linq-to-nhibernate

我有这样的陈述:

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 个答案:

答案 0 :(得分:16)

尝试IndexOf

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

它不起作用的原因是因为接受Contains的{​​{1}}扩展方法正在IEqualityComparer<TSource>上运行,String实现IEnumerable<char>,而不是{{1}因此无法将IEnumerable<string>string传递给它。

答案 1 :(得分:3)

即使有Contains(source, item, comparer)方法,你也不能将它与NHibernate一起使用,因为比较器是代码,而不是NH可以翻译的表达式树。

*:即使您为比较器编写了一个LINQ提供程序扩展,即特殊情况生成,但情况并非如此。

答案 2 :(得分:2)

您使用的.Contains来自LINQ - 它将字符串视为IEnumerable<char>,因此它需要IEqualityComparer<char>StringComparer比较器实现了IEqualityComparer<String>

如果minitech的IndexOf方法有效,我认为这将是最简单的方法。

答案 3 :(得分:-2)

将以下命名空间添加到您的班级

using System.Linq;

希望它有所帮助。