2009-06-20 91 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