问题
I have a statement like so:
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;
This seems to be exactly what I'm supposed to do, but I get the whole line with the Contains
method underlined with the following message:
string
does not contain a definition forContains
and the best extension method overloadSystem.Linq.ParallelEnumerable.Contains<TSource>(System.Linq.ParallelQuery<TSource>, TSource, System.Collections.Generic.IEqualityComparer<TSource>)
has some invalid arguments
What am I doing wrong?
回答1:
Try IndexOf
:
searchString.IndexOf(saup.FriendlyName,
StringComparison.InvariantCultureIgnoreCase) != -1
The reason it doesn't work is because the Contains
extension method that accepts an IEqualityComparer<TSource>
is operating on a String
, which implements IEnumerable<char>
, not IEnumerable<string>
, so a string
and an IEqualityComparer<string>
can't be passed to it.
回答2:
Even if there is a Contains(source, item, comparer) method, you can't* use that with NHibernate, as comparers are code, not expression trees that NH can translate.
*: that is, unless you write a LINQ provider extension that special-cases generation for your comparer, but that's not the case.
回答3:
The .Contains you are using comes from LINQ - it sees the String as an IEnumerable<char>
, so it wants an IEqualityComparer<char>
. The StringComparer
comparers implement IEqualityComparer<String>
.
If minitech's IndexOf
method works, I think that will be the easiest way.
回答4:
Add following namespace to your class,
using System.Linq;
Hope it helps.
来源:https://stackoverflow.com/questions/12344002/string-does-not-contain-a-definition-for-contains