要使用 NHibernate 执行此操作,您需要添加以下类...
public class RandomOrder : Order
{
public RandomOrder()
: base(String.Empty, true)
{ }
public override SqlString ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)
{
return new SqlString("NEWID()");
}
}
以及以下扩展方法...
public static IQueryOver<TRoot, TSubType> OrderByRandom<TRoot, TSubType>(this IQueryOver<TRoot, TSubType> query)
{
query.UnderlyingCriteria.AddOrder(new RandomOrder());
return query;
}
这将允许您执行以下操作...
var test = session.QueryOver<Entity>().OrderByRandom().Take(5).ToList();
使用 NHibernate FluentMapping 和 Linq to NHibernate 来做到这一点......
向您的班级添加新属性
public virtual string Random { get; set; }
然后将流动映射添加到您的ClassMap<T>
Map(o => o.Random).Formula("NEWID()");
最后,您可以通过以下方式调用它
ctx.Query<T>().OrderBy(o => o.Random).Take(5).ToList();
要使用 EF 执行此操作,您需要将以下方法添加到 DataContext 类中......
[Function(Name = "NEWID", IsComposable = true)]
[return: Parameter(DbType = "uniqueidentifier")]
public Guid Random()
{
return Guid.NewGuid();
}
那么您可以通过执行以下操作来调用它...
dc.Products.OrderBy(o => dc.Random()).Take(5)
这将为您提供以下结果...
SELECT TOP(5) * FROM Products ORDER BY NEWID()