2009-06-20 3 views
0

좋아,Subsonic으로 검색 쿼리

오늘 나는 Subsonic을 배우려고 노력하고 있습니다. 꽤 멋진 재료.

내 웹 사이트에 검색 기능을 추가하려고하지만 Subsonic에서이를 달성하는 방법에 대해 고심하고 있습니다.

하나의 검색 필드에 여러 개의 키워드가 포함될 수 있습니다. 모든 키워드와 일치하는 결과를 반환하고 싶습니다. 검색 대상은 단일 텍스트 열입니다.

은 지금까지 나는 (그것을 실행 없지만 결코 결과를 반환)이 있습니다

return new SubSonic.Select().From(Visit.Schema) 
      .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
      .Where(InfopathArchive.XmlDocColumn).Like(keywords) 
      .ExecuteTypedList<Visit>();  

이 방문 테이블과 InfoPathArchive 테이블 사이의 일대일 매핑이 있습니다. 관련 XMLDocColumn에 키워드가있는 방문수 컬렉션을 반환하기 만하면됩니다.

내가 그 일을 할 수 있다면 좋을 것입니다. 이제 두 번째 문제는 누군가가 'australia processmodel'을 검색하면 분명히 위의 코드는 정확한 구문만을 반환해야한다는 것입니다. 검색 용어를 분할하여 모든 개별 검색어가 포함 된 문서를 반환해야하는 검색어를 만들려면 어떻게해야합니까?

도움을 주시면 감사하겠습니다.

편집 : 좋아, 기본 검색 작동하지만 여러 키워드 검색 doesnt. Adam이 제안한 바를 수행했지만 Subsonic은 쿼리에 하나의 매개 변수만을 사용합니다. 여기

코드이다

 List<string> wordsInQueryList = keywords.Split(' ').ToList(); 

     SqlQuery q = Select.AllColumnsFrom<Visit>() 
      .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
      .Where(Visit.IsDeletedColumn).IsEqualTo(false); 

     foreach(string wordInQuery in wordsInQueryList) 
     { 
      q = q.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%"); 
     } 

복귀 q.ExecuteTypedList();

SELECT (bunch of columns) 

FROM [dbo].[Visit] 
INNER JOIN [dbo].[InfopathArchive] ON [dbo].[Visit].[VisitId] = [dbo].[InfopathArchive].[VisitId] 
WHERE [dbo].[Visit].[IsDeleted] = @IsDeleted 
AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc 
AND [dbo].[InfopathArchive].[XmlDoc] LIKE @XmlDoc 

는 그래서 마지막 키워드가 검색되는 것을 끝 :

는 그럼 난 음속가 생성하는 쿼리를 보면.

아이디어가 있으십니까?

+0

이전 버전의 Subsonic에서는 버그입니까? 나는 2.1을 사용하고 있으며 실제로이 시점에서 업그레이드 옵션을 갖고 있지 않습니다. – Alex

답변

1

첫 번째 질문 :

return new SubSonic.Select().From(Visit.Schema) 
     .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
     .Where(InfopathArchive.XmlDocColumn).Like("%" + keywords + "%") 
     .ExecuteTypedList<Visit>(); 

두 번째 질문 :

SqlQuery query = DB.Select().From(Visit.Schema) 
     .InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn) 
     .Where("1=1"); 

foreach(string wordInQuery in wordsInQueryList) 
{ 
    query = query.And(InfopathArchive.XmlDocColumn).Like("%" + wordInQuery + "%") 
} 

return query.ExecuteTypedList<Visit>(); 

을 다음과 같이 음속 쿼리를 작성하는 기능에 쿼리에서 단어의 목록을 통과은 분명히이 안된 그러나 그것은 올바른 방향으로 당신을 지적해야합니다.

+0

우수. 당신의 도움을 주셔서 감사합니다. 실적이 그렇게 좋은 이유는 무엇입니까? 나는이 같은 질의가 다소 느릴 것으로 예상했다. 나는 그 질문을 내가 대답을 알지 못해도 살 수 있다고 생각한다.) – Alex

1

아담이 제안한 바를 수행하거나 2.2로 간단히 Like ("% ... %") 대신 "Contains()"를 사용할 수 있습니다. 우리는 또한 StartsWith와 EndsWith()를 지원합니다 :

+0

네가 여기있는 동안 Rob - Subsonic 3이 언제 나갈거야?DAL에 Subsonic을 사용하도록 강요하고 LINQ 추가는 매우 강력한 주장을 제시하는 데 도움이됩니다. – Alex