2009-06-20 81 views
0

好吧,亞音速搜索查詢

今天我正在學亞音速。非常酷的東西。

我試圖建立一些搜索功能到我的網站,但我在努力,我怎麼可能會在亞音速實現這一目標。

我有一個搜索字段可能包含多個關鍵字。我想返回匹配所有關鍵字的結果。搜索目標是單個文本列。

到目前爲止,我有這個(它運行,但不會返回結果):

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

還有就是訪問表和InfoPathArchive表之間的一對一的映射。我只想返回在相關XMLDocColumn中具有關鍵字的訪問集合。

如果我能做到這一點,它會很好。現在第二個問題是,如果有人搜索「澳大利亞processmodel」,那麼顯然上面的代碼應該只返回該確切的短語。如何創建一個查詢來分割我的搜索詞,以便它必須返回包含所有單個搜索詞的文檔?

任何幫助表示讚賞。

編輯:好吧,所以基本的搜索工作,但多關鍵字搜索沒有。我做了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 2009-06-21 11:26:25

回答

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 2009-06-21 10:05:07

1

你可以做什麼亞當建議或與2.2你可以簡單地使用「包含()」,而不是像(「%...%」)。我們也支持StartsWith和EndsWith():)

+0

雖然你在這裏羅布 - 什麼時候是亞音速3出去?我想推動Subsonic對我們的DAL的使用,LINQ的增加會幫助我提出一個非常有力的論點。 – Alex 2009-06-21 10:04:01