SQL Server中(所有版本)含有newid()函数,可生成36位随机类似GUID的随机数,利用这个特征排序可产生随机排序效果。
由于NHibernate中Order By的字段必须是实体中的属性名称,在不使用HQL的情况下,扩展NHibernate的Order可达到目的。
继承NHibernate的Order构造新类MsSqlRandomOrder
using System;
using NHibernate.Criterion;
using NHibernate.SqlCommand;
namespace Extends.NHibernate
{
/// <summary>
/// SqlServer随机排序
/// </summary>
[Serializable]
public class MsSqlRandomOrder : Order
{
public MsSqlRandomOrder() : base("", true) {}
public override SqlString ToSqlString(global::NHibernate.ICriteria criteria, ICriteriaQuery criteriaQuery)
{
SqlString sb = new SqlString();
sb = sb.Append("newid()");
sb = sb.Append(ascending ? " asc" : " desc");
return sb;
}
}
使用时,在原添加Order的地方替换成new MsSqlRandomOrder即可。
...
ICriteria criteria = session.CreateCriteria<T>();
criteria.AddOrder(new MsSqlRandomOrder());
return criteria.List();