Linq или QueryOver будут вашими самыми чистыми решениями.Если вы полны решимости остаться с ICriteria, вы, вероятно, захотите обернуть каждую из ваших сущностей классом с помощью общих методов crud, это также сделает ваш код доступным, так что исправления кода выполняются в одном месте, а не над сотнями файлов или классов.
На http://nhforge.org/wikis/general/open-source-project-ecosystem.aspx есть множество проектов, которые могут вам помочь.Я знаю, что NhGen (http://sourceforge.net/projects/nhgen/) создает класс CRUD для каждой сущности на основе класса GenericDao NHibernate.Burrows с несколькими методами CRUD.Он заботится обо всех псевдонимах и объединениях, поэтому запросы становятся такими простыми, как
IMessageDao messageDao = new MessageDao();
// Get All
IList<IMessage> messageList1 dao.FindAll();
// Find using QueryByExample
IList<IMessage> messageList2 = dao.FindByExample(messageDetails, orderBy)).ToList();
// Find using a simple entity query
IList<IMessage> messageList3 = messageDao.Find( new [] { Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked) } );
// Find using a join and a query on said joined entities
IList<IMessage> messageList4 = messageDao.Find
( new []
{
Restrictions.Le(MessageHelper.Columns.Date, dateLastChecked),
Restrictions.Eq(MessageHelper.Columns.IsActive, true))
}, new[]
{
Restrictions.Eq(CategoryHelper.KeyColumns.Rsn, categoryRsn),
Restrictions.Eq(CategoryHelper.Columns.IsActive, true))
}, new []
{
Restrictions.Eq(ChannelHelper.KeyColumns.Rsn, channelRsn),
Restrictions.Eq(ChannelHelper.Columns.IsActive, true))
}
);
. Существует множество переопределений, поэтому вы можете указать свой тип объединения или, естественно, оно предполагает внутреннее соединение.