我有一个SQL 2008 R2数据库,设置了全文索引,并希望使用NHibernate来获取排名搜索结果。我已经想出了用于获得结果排名的SQL查询以及FULLTEXTTABLE,但我正在努力使用NHibernate来获得排名值的结果,因为它没有映射到任何表中的实际列。
任何指针?
答案 0 :(得分:1)
(首先,以下语法会有点模糊,因为这是来自内存,请检查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
类,虽然这不是必需的,我只是为了方便而做。
此PersonDTO
类仅用于查询,但存在限制,如以下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[]>();
在结果变量中,每个返回的行是一个对象[],第一个元素(即结果[0] [0])是排名,第二个元素(即结果[0] [1])是正确的托管Person对象