好的,
今天我正在努力学习亚力学。很酷的东西。
我正在尝试在我的网站中构建一些搜索功能,但我正在努力解决如何在Subsonic中实现这一目标。
我有一个可以包含多个关键字的搜索字段。我想返回与所有关键字匹配的结果。搜索的目标是单个文本列。
到目前为止,我有这个(它运行但永远不会返回结果):
return new SubSonic.Select().From(Visit.Schema)
.InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
.Where(InfopathArchive.XmlDocColumn).Like(keywords)
.ExecuteTypedList<Visit>();
Visit表和InfoPathArchive表之间存在一对一的映射。我只想返回在相关的XMLDocColumn中包含关键字的Visits集合。
如果我能做到这一点就会很棒。现在第二个问题是,如果有人搜索'australia 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 + "%");
}
return q.ExecuteTypedList();
然后,如果我查看Subsonic生成的查询:
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 :(得分:1)
第一个问题:
return new SubSonic.Select().From(Visit.Schema)
.InnerJoin(InfopathArchive.VisitIdColumn, Visit.VisitIdColumn)
.Where(InfopathArchive.XmlDocColumn).Like("%" + keywords + "%")
.ExecuteTypedList<Visit>();
第二个问题:
将查询中的单词列表传递给构建SubSonic查询的函数,如下所示
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>();
显然这是未经测试的,但它应该指向正确的方向。
答案 1 :(得分:1)
你可以做亚当所建议的,或者用2.2你可以简单地使用“Contains()”代替Like(“%...%”)。我们还支持StartsWith和EndsWith():)