我正在使用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;
但它会引发异常但不起作用......
还有其他方法或解决方案吗?
由于
干杯
答案 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;
}