(Прежде всего следующий синтаксис будет немного мутным, потому что это из памяти, пожалуйста, проверьте 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>())
вернет PersonDTO, который nhibernate удастся собрать, поскольку каждый элемент в списке выбора соответствует свойству (по имени, регистру, типу) в классе 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]) является надлежащим образом объект управляемого лица