Linq到NHibernate,由Rand()订购?

时间:2010-05-28 11:40:24

标签: linq nhibernate random sql-order-by linq-to-nhibernate

我正在使用Linq To Nhibernate,并且使用HQL语句我可以这样做:

string hql = "from Entity e order by rand()";

Andi t将被随机排序,我会链接知道如何与Linq对Nhibernate做同样的陈述?

我试试这个:

var result = from e in Session.Linq<Entity> 
             orderby new Random().Next(0,100) 
             select e;

但它会引发异常但不起作用......

还有其他方法或解决方案吗?

由于

干杯

1 个答案:

答案 0 :(得分:3)

我想Linq对NHibernate无法将Random.Next调用转换为SQL ...

一个选项是在从数据库中检索结果后对结果进行排序:

var rand = new Random();
var query =  from e in Session.Linq<Entity> 
             select e;
var result = from e in query.AsEnumerable()
             orderby rand.Next(0,100) 
             select e;

请注意,您需要使用Random的单个实例,因为种子基于当前的滴答数;如果你创建了几个间隔很短的Random实例,它们将具有相同的种子,并生成相同的序列。

无论如何,基于随机数对集合进行排序并不是一个好主意,因为排序不稳定,理论上可以永久存在。如果您需要随机播放结果,可以使用Fisher-Yates算法:

var result = Session.Linq<Entity>().ToArray();
var rand = new Random();
for(int i = result.Length - 1; i > 0; i--)
{
    int swapIndex = rand.Next(i + 1);
    var tmp = result[i];
    result[i] = result[swapIndex];
    result[swapIndex] = tmp;
}