Question

I am using a predicate builder class and I need to invoke the contains method on an array of strings so in the code below instead of radio I would be passing in an array of strings:

wherePredicate = wherePredicate.Or(m => m.MediaType.Contains("Radio"));

the full code section:

if (param.iMediaGroupID > 0)
{
    var wherePredicate = PredicateBuilder.False<MediaChannelModel>();

    var ss = new NeptuneRepository<Lookup_MediaTypes>();
    var mediagroups = ss.FindWhere(m => m.MediaGroupID == param.iMediaGroupID).Select(m => m.Name);
    //problem area
    wherePredicate = wherePredicate.Or(m => mediagroups.Contains(m.MediaType));
    predicate = predicate.And(wherePredicate);
}

mediaGroups is: ["Radio","Tv","Magazine"]

If m.MediaType is any of these values then the predicate is true.

Is there a way to do this in C#?

Était-ce utile?

La solution

I suspect you want something like:

wherePredicate = wherePredicate.Or(m => array.Contains(m.MediaType));

Or perhaps:

wherePredicate = wherePredicate.Or(m => array.Any(x => m.MediaType.Contains(x)));

If neither of those are what you're after, please clarify your requirements.

EDIT: The problem you're now facing is that you're not actually asking whether an array contains the value. You're asking whether a query contains a value. If you change it to an actual array, you may well find it works:

var mediagroups = ss.FindWhere(m => m.MediaGroupID == param.iMediaGroupID)
                    .Select(m => m.Name)
                    .ToArray();

However, if these are querying the same database, you'd be better off trying to do this in some kind of join.

Autres conseils

Jon Skeet's answer worked perfectly for me. I had been struggling to make the .Contains search for a substring in a string array against the database, rather than try to find a substring in a single C# string object. Thank you!

Here's the modified code that worked for me:

var predicate = PredicateBuilder.False<ClientXMemberDetail>();
predicate = predicate.Or(x => strArrselectedCustomMemberNumbers.Any<string>(y => x.MemberID.Contains(y)));
CustomSearchMembersAlreadyMatched = ClientXContext.ClientXMemberDetails
                        .AsExpandable()
                            .Where(predicate)
                            .ToList()
                            .Select(r => r.MemberID.ToString()).ToList();

(ClientXContext above is an instance of the ObjectContext class, strArrselectedCustomMemberNumbers is a string array, ClientXMemberDetails is ObjectSet, where ClientXMemberDetail is the EntityObject)

Edit: Anonymized my client's name

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top