Fluent NHibernate: что лучше выбирать из представления или выполнять соединения для получения значений MIN и MAX из связанной таблицы?

Отказ от ответственности: я новичок в NHibernate/Fluent NHibernate.

У меня есть таблица событий:

ID UniqueIdentifier,
Name varchar(100),
Details varchar(MAX)
....

У меня также есть таблица поиска, которая показывает места событий:

ID UniqueIdentifier,
StartDate datetime,
EndDate datetime,
City varchar(100)
....

Что я хочу сделать, так это вернуть значения MIN (StartDate) и MAX (EndDate) из моей таблицы местоположений при возврате списка моих событий.

Теперь, по традиции, я бы построил представление на SQL для моей таблицы событий, которая возвращала бы эти совокупные значения. Насколько я понимаю, если бы я делал это при использовании NHibernate, мне нужно было бы создать две карты Fluent: одну для просмотра (которая ссылается на мое представление SQL) и одну для вставки/редактирования, которая ссылается на мою таблицу.

Я прав?

Другой вариант, о котором я подумал, заключается в том, что в моем отображении Fluent я мог бы каким-то образом выполнять агрегированные функции MIN и MAX для таблицы связанных местоположений.

Какой метод предпочтительнее и как мне выполнить задачу?

Спасибо - Джоэл


person hiro77    schedule 31.08.2011    source источник


Ответы (1)


если min и max предназначены для определенных событий, вы можете отобразить их следующим образом:

Map(x => x.MaxDate).Formula("(SELECT MAX(EndDate) FROM locations l WHERE l.ID = ID)");
Map(x => x.MinDate).Formula("(SELECT MIN(StartDate) FROM locations l WHERE l.ID = ID)");

Примечание. Эти свойства доступны только для чтения (никогда не записываются обратно).

если это должно быть глобальное использование фьючерсов (3 запроса выдаются как одно обращение туда и обратно)

var mindate = session.QueryOver().FutureValue();
var maxdate = session.QueryOver().FutureValue();
var events = session.QueryOver().Future();
person Firo    schedule 31.08.2011
comment
Фиро, ваше решение Формулы выше сработало прекрасно. Мне просто нужно было поместить псевдоним местоположений (l) перед именами столбцов EndDate и StartDate, чтобы он работал: (SELECT MAX(l.EndDate) FROM...... Спасибо - Джоэл - person hiro77; 31.08.2011