我有一个分页搜索结果列表。用户可以搜索“derp”,并返回名称中任何位置的任何字符序列。
我被要求更改此设置,以便最初按相关性对这组结果进行排名。因此,如果通常列表将作为
返回a derp abc // everything is alphabetical
a derp xyz
b derp abc
derp abc
derp def
herp derp a
herp derp b
现在列表需要按
排序derp abc // these guys are given prominence
derp def
a derp abc // the rest of results alphabetical as normal
a derp xyz
b derp abc
herp derp a
herp derp b
请记住,这个列表必须被分页(即我不能只是从搜索结果中取出并从中间手动删除'derp'并将它们移到前面),NHibernate有什么方法可以我可以指定所需的排名吗?
或者我是否必须进行2次查询,首先搜索以“derp”开头的任何内容以及第二次包含“derp”但不是以“derp”开头的内容?
答案 0 :(得分:4)
OrderBy可以使用Projections,所以这样可以正常工作:
var list = session.QueryOver<Store>()
.Where(s => s.Name.IsLike("My", MatchMode.Anywhere))
.OrderBy(NHibernate.Criterion.Projections.Conditional(
NHibernate.Criterion.Restrictions.Like(
NHibernate.Criterion.Projections.Property<Store>(s => s.Name), "My",
MatchMode.Start),
NHibernate.Criterion.Projections.Constant(0),
NHibernate.Criterion.Projections.Constant(1))).Asc
.ThenBy(s => s.Name).Asc
.List();
我们在这里做的是使用一个基本上转换为以下SQL的Projection:
ORDER BY (case when this_.Name like 'My%' then 0 else 1 end)