2012-10-02 51 views
0

我有一些現有代碼需要修改才能搜索多個關鍵字。 (我是新來的這一切的方式)使用LINQ搜索多個關鍵字vb

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 

我怎麼會去改變這個,所以如果我輸入的條件「貓毛」那就做一個或搜索。所以...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中這可能已經奏效,但在這種情況下我會怎麼做呢?

回答

1

您可以使用.Any.Contains組合:如果有任何人

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清單,並檢查看:

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那TopicTitle包含。

對不起,這是在C#中,但您可以看到如何在.Where中執行lamda表達式。只需發送一個List到你的方法,查詢,你很好去。

+0

謝謝,但正如我所說,我是新來的這一切。我需要一些VB語法。 – odle

+0

這些方法以相同的方式使用。 '昏暗主題作爲IQueryable的(共Global.Platform.Core.Data.Topic)= _ \t在t在_db.Topics \t凡strings.Any(S => t.TopicTitle.Contains(S)) \t選擇噸;'那樣的東西。 – Gromer

+0

使用此鏈接可在VB和C#之間進行翻譯。 [C#到VB](http://www.developerfusion.com/tools/convert/csharp-to-vb/) –

0

假設TopicTitle和條件是空格分隔的字符串我會交叉兩個集合,並檢查是否有任何匹配。

 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