2012-10-02 1 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 

어떻게 내가 기준 "고양이 머리"를 입력 한 경우 그래서는 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에서 이것이 효과가 있었는지는 알지만,이 시나리오에서는 어떻게해야할까요?

당신은 .Any.Contains의 조합을 사용할 수 있습니다

답변

1

: 그 중 하나가있는 경우

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#이지만, lamda 표현을 수행하는 방법은 .Where에서 볼 수 있습니다. 쿼리를 수행하는 메소드에 List을 보내면됩니다.

+0

감사하지만 말했듯이, 저는이 모든 것을 처음 접했습니다. 나는 VB 구문에서 뭔가가 필요합니다. – odle

+0

이러한 방법은 동일한 방식으로 사용됩니다. ' \t 경우 strings.Any (S => t.TopicTitle.Contains (들)) \t 선택 t _db.Topics에서 t에서 = _ (Global.Platform.Core.Data.Topic의) 된 IQueryable로 \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