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 进行操作String,它实现了IEnumerable<char>, not IEnumerable<string>,所以 astring和 anIEqualityComparer<string>不能传递给它。

于 2012-09-10T00:06:08.400 回答
3

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

*:也就是说,除非您编写一个 LINQ 提供程序扩展来为您的比较器生成特殊情况,但事实并非如此。

于 2012-09-10T00:19:33.137 回答
2

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

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

于 2012-09-10T00:21:48.437 回答
-3

将以下命名空间添加到您的类中,

using System.Linq;

希望能帮助到你。

于 2016-03-13T01:29:09.043 回答