问题描述
|
我有一个分页的搜索结果列表。用户可以搜索\'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 \'开头但又不以它开头的内容?
解决方法
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)