问题描述
|
我有一个设置了全文索引的SQL 2008 R2数据库,并希望使用NHibernate来获取具有排名的搜索结果。我已经想出了使用FULLTEXTTABLE进行SQL查询以获取结果排名的方法,但是由于该方法未映射到任何表中的实际列,因此我在如何使用NHibernate获取具有排名值的结果方面遇到了困难。
有指针吗?
解决方法
(首先,以下语法会有点朦胧,因为这是从内存中获取的,请检查api)
好了,您可以构造一些DTO类并即时映射
例如:
public class Person
{
public virtual String Name {get;set;}
public virtual String Surname {get;set;}
}
正确映射到nhibernate
和
PersonDTO : Person
{
public int FTSRanking {get;set;}
}
没有映射。请注意,我是从类Person
继承的,尽管这不是必需的,而我只是为了简便起见。
此类“ 3”类仅用于查询,但有其局限性,如以下hql所示。
NHSes.CreateQuery(\'select p.Name,p.Surname,p.FTSAlias as FTSRanking from Person p\')
.SetResultTransformer(Transformers.AliasToBean<PersonDTO>())
将返回nhibernate设法汇编的PersonDTO,因为选择列表中的每个项目都与PersonDTO类中的属性(名称,大小写,类型)匹配。另外,您还必须手动键入选择列表,并且由于它不是映射类,因此nhibernate无法汇编集合。
另一种选择是使用Criteria API,在其中设置投影(也可以扩展选择列表)
IList<object[]> results = NHSes.CreateCriteria(typeof(Person))
.Add(Expression.SQL(\" your fts clause here \"))
.SetProjection(Projections.SQL(\" add your fts ranking column here\",),Projections.( here add as a projection the main entity ))
.List<object[]>();
其中在结果变量中,每个返回的行都是一个object [],第一个元素(即results [0] [0])是排名,第二个元素(即results [0] [1])是一个经过妥善管理的Person对象