Как было выяснено, можно средствами SQL выбрать случайные записи из таблицы базы данных. Теперь вопрос состоит в том, как сделать тоже самое при помощи NHibernate.
Выбор случайных записей при помощи NHibernate
2
Спросил
Лучший ответ:
2
Выбор случайных строк реализован в разных БД по разному и NHibernate не предоставляет никакой абстракции над этим механизмом. Но можно использовать расширяемость NHibernate и реализовать это самому. Сначала нужно создать собственную реализацию Order:
public class RandomOrder : Order
{
public RandomOrder() : base("", true)
{
}
public override string ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
// Здесь возвращаем команду генерации рандомного идентификатора
// (выбираем только одну строку)
return "newid()"; // Для MS SQL Server
return "RAND()"; // Для MySql
return "RANDOM()"; // Для PostgreSQL
return "RAND()"; // Для IBM DB2
}
}
Затем этот класс можно использовать при работе с сессией:
public IList<Item> GetRandomItems(int count)
{
return HibernateTemplate.Execute(
session =>
{
var criteria = session.CreateCriteria(typeof(Item));
criteria.AddOrder(new RandomOrder());
return criteria.SetMaxResults(count).List<Item>();
}
);
}