Выбор случайных записей при помощи NHibernate - CodeHelper

Выбор случайных записей при помощи NHibernate

2

Как было выяснено, можно средствами SQL выбрать случайные записи из таблицы базы данных. Теперь вопрос состоит в том, как сделать тоже самое при помощи NHibernate.

Лучший ответ:

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>();
        }
    );
}
v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.