gpt4 book ai didi

Linq 到 NHibernate,按 Rand() 排序?

转载 作者:行者123 更新时间:2023-12-04 06:52:28 24 4
gpt4 key购买 nike

我正在使用 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;

但它抛出异常并且不起作用......

有没有其他方法或解决方案?

谢谢

干杯

最佳答案

我猜 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 的多个实例间隔很短,它们将具有相同的种子,并生成相同的序列。

无论如何,基于随机数对集合进行排序并不是一个好主意,因为排序不会稳定并且理论上可以永远持续下去。如果需要对结果进行shuffle,可以使用 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;
}

关于Linq 到 NHibernate,按 Rand() 排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2928604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com