0

複数のキーワードを検索するために変更する必要がある既存のコードがいくつかあります。(ちなみに、私はこれらすべてに慣れていません)

Dim topics As IQueryable(Of Global.Platform.Core.Data.Topic) = _
               From t In _db.Topics
               Where t.IsActive = True And t.TopicTitle.Contains(criteria) And t.ForumID = 0 And Not t.TopicTitle.Contains("default") And t.Member.IsActive = True And t.IsActive = True
               Order By t.DateCreated Descending
               Select t
               Take (take_x)
Return topics

「猫の毛」という条件を入力すると、OR 検索が実行されるように、これを変更するにはどうすればよいでしょうか。そう...t.TopicTitle.Contains("cat") OR t.TopicTitle.Contains("hair") ...。もちろん、動的である必要があります。

私はこれを試しましたが、動作させることができませんでした。

Dim criteriaArr As Array = criteria.Split(" ")
            Dim new_criteria As String = " t.TopicTitle.Contains(" + criteriaArr(0) + ")"
            If criteriaArr.Length > 1 Then
                For Each item As String In criteriaArr
                    new_criteria += " Or t.TopicTitle.Contains(" + item + ")"
                Next
            End If

アイデアは、スペースを分割し、where 句に追加し続けることでした。SQL でこれが機能した可能性があることは知っていますが、このシナリオではどうすればよいでしょうか?

4

2 に答える 2

1

.Anyとの組み合わせを使用できます.Contains

var strings = new List<string> { "cat", "dog", "bill" };
using (var context = new MyEntities())
{
    var matches = context.MyObject.Where(x => strings.Any(s => x.TopicTitle.Contains(s)));
}

VB:

Dim strings = {"cat", "dog", "bill"}

Using context = New MyEntities()
    Dim matches = context.MyObject.Where(Function(x) strings.Any(Function(s) x.TopicTitle.Contains(s)))
End Using

これはstringsクエリ単語のリストを取得し、含まれている単語があるかどうかを確認しTopicTitleます。

申し訳ありませんが、これは C# ですが、ラムダ式の実行方法は.Where. Listクエリを実行するメソッドに を送信するだけで、準備完了です。

于 2012-10-02T15:50:30.220 に答える
0

TopicTitleと基準がスペースで区切られた文字列であると仮定して、2つのコレクションを交差させ、一致するものがあるかどうかを確認します。

        Dim topics As IQueryable(Of Global.Platform.Core.Data.Topic) = _
           From t In _db.Topics
           Where t.IsActive = True And t.TopicTitle.Intersect(criteria).Any()
                And t.ForumID = 0 And Not t.TopicTitle.Contains("default") 
                And t.Member.IsActive = True And t.IsActive = True
           Order By t.DateCreated Descending
           Select t
           Take (take_x)
        Return topics
于 2012-10-02T18:19:06.517 に答える