0

私は述語ビルダー クラスを使用しており、文字列の配列に対して contains メソッドを呼び出す必要があるため、以下のコードではラジオの代わりに文字列の配列を渡します。

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

完全なコード セクション:

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は:["Radio","Tv","Magazine"]

m.MediaTypeがこれらの値のいずれかである場合、述語は true です。

C#でこれを行う方法はありますか?

4

2 に答える 2

7

次のようなものが必要だと思います:

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

多分:

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

どちらも求めていない場合は、要件を明確にしてください。

編集:あなたが今直面している問題は、配列に値が含まれているかどうかを実際に尋ねていないことです。クエリに値が含まれているかどうかを尋ねています。これを実際の配列に変更すると、うまく機能することがわかります。

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

ただし、これらが同じデータベースに対してクエリを実行している場合は、何らかの結合でこれを行う方がよいでしょう。

于 2013-06-18T07:24:19.773 に答える
0

Jon Skeetの答えは私にとって完璧に機能しました。私は、単一の C# 文字列オブジェクトで部分文字列を検索しようとするのではなく、データベースに対して文字列配列内の部分文字列を .Contains 検索するのに苦労していました。ありがとうございました!

これが私のために働いた修正されたコードです:

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 は ObjectContext クラスのインスタンス、strArrselectedCustomMemberNumbers は文字列配列、ClientXMemberDetails は ObjectSet、ClientXMemberDetail は EntityObject)

編集:クライアントの名前を匿名化しました

于 2013-10-17T23:36:19.233 に答える