2010-01-06 4 views
5

나는 사용자가 용어 목록을 검색 할 수있는 나의 응용 프로그램에있는 케이스가 있습니다. 수색은 다음 순서로 세 번 통과해야합니다.Linq to Sql 어떤 키워드 검색 쿼리

  • 입력 한 내용과 정확히 일치하는 것. 간단 해.
  • 모든 단어가 (개별적으로) 일치하는 곳. 완료, 쉽게.
  • 하나가 인데 어떤 단어가 ... 일치합니까? 기본적으로

, 어떻게, LINQ to SQL은에,이 작업을 수행하도록 지시 않습니다 등등

select * from stuff s where s.Title like '%blah%' || s.Title like '%woo&' || s.Title like '%fghwgads%' || s.Title like... 

그리고를?

+0

이런 종류의 것은 실제로 전체 텍스트 검색에서 가장 잘 처리된다는 것을 알아야합니다. 'LIKE '% xyz %'버전이 실행되지만 성능은 떨어질 것입니다. – Aaronaught

답변

7

이것은 힘든 문제 일 수 있습니다 ... 나는 당신이 자신의 운영자를 작성해야한다고 생각합니다.

(업데이트 :. 그래, 나는 그것을 테스트, 작동) :

string[] terms = new string[] { "blah", "woo", "fghwgads" }; 
var results = stuff.LikeAny(s => s.Title, terms); 

P.S.

public static class QueryExtensions 
{ 
    public static IQueryable<TEntity> LikeAny<TEntity>(
     this IQueryable<TEntity> query, 
     Expression<Func<TEntity, string>> selector, 
     IEnumerable<string> values) 
    { 
     if (selector == null) 
     { 
      throw new ArgumentNullException("selector"); 
     } 
     if (values == null) 
     { 
      throw new ArgumentNullException("values"); 
     } 
     if (!values.Any()) 
     { 
      return query; 
     } 
     var p = selector.Parameters.Single(); 
     var conditions = values.Select(v => 
      (Expression)Expression.Call(typeof(SqlMethods), "Like", null, 
       selector.Body, Expression.Constant("%" + v + "%"))); 
     var body = conditions.Aggregate((acc, c) => Expression.Or(acc, c)); 
     return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); 
    } 
} 

그런 다음에이 부를 수있는 QueryExtensions 클래스의 네임 스페이스에 System.Linq.ExpressionsSystem.Data.Linq.SqlClient 네임 스페이스를 추가해야합니다.

+0

그게 효과가! 고맙습니다! – Dusda

+0

Linq에서 Entities 코드를 사용하여이 오류가 발생합니다. LINQ to Entities가 'Boolean Like (System.String, System.String)'메서드를 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다. –