2

我正在使用 Linq To Nhibernate,并且使用 HQL 语句我可以执行以下操作:

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

Andi t 将被随机排序,我会链接到知道如何使用 Linq to Nhibernate 执行相同的语句?

我试试这个:

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

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

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

谢谢

干杯

4

1 回答 1

3

我猜 Linq to 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;
}
于 2010-05-28T12:53:18.633 回答