2011-09-27 3 views
2

사용자가 주소 입력란 1, 도시, 도시 코드 등 모든 주소 필드를 검색하는 단일 'google'스타일의 쿼리 상자가있는 간단한 주소록 화면을 만들려고합니다.Linq이 여러 필드에서 검색하는 것과 같습니다.

SQL 데이터베이스와 함께 .net 및 EF를 사용하고 있습니다. 나는 시도했다

IEnumerable<T> results = from x in dbSet 
         where (x.AddressLine1 + x.AddressLine2 + 
           x.AddressLine3 + x.Town + x.City + 
           x.County + x.Postcode).Contains(Query) 
         select x; 

이것은 어떤 결과와도 일치하지 않는다. 내가

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) 
         select x; 

그것은 일치하는 반환 결과를하지만 분명히 그 모든 필드를 통해 검색되지로 변경합니다. 첫 번째 질문은 왜 첫 번째 예제가 작동하지 않고 두 번째 질문은이 문제를 구현하는 가장 좋은 방법인지 또는 압력을 받고 어려움을 겪을 것인지입니다. 더 복잡한 검색을위한

IEnumerable<T> results = from x in dbSet 
         where x.AddressLine1.Contains(Query) || 
         x.AddressLine2.Contains(Query) || 
         x.AddressLine3.Contains(Query) || 
         x.Town.Contains(Query) || 
         x.City.Contains(Query) || 
         x.County.Contains(Query) || 
         x.Postcode 
         select x; 

LinqKit

+0

'AddressLine1','AddressLine2','County' 등 모두'string' 타입입니까? –

답변

3

이 시도 사용할 경우 발생하는

1

각 행에 일부 하위 문자열 일치 작업이 있습니다. 큰 테이블에서이 부분을 수행 할 수 없다고 상상해보십시오. 정말로해야 할 일은 SQL 전체 텍스트를 사용하는 것입니다. EF에서이 기본 지원이 없지만 저장 프로 시저 또는 저장소 쿼리를 사용할 수 있습니다.

2

가 현재 접근 방식은 전체 테이블 스캔이 필요합니다, 내가 사용하는 Linq에를 사용 :이

IEnumerable<T> results = from x in dbSet 
where x.AddressLine1.ToString().Contains(Query) || 
    x.AddressLine2.ToString().Contains(Query) || 
    x.AddressLine3.ToString().Contains(Query) || 
    x.Town.ToString().Contains.(Query)|| 
    x.City.ToString().Contains.(Query) || 
    x.Postcode.ToString().Contains(Query) 
select x; 
관련 문제