Линк в NHibernate, заказ Рэнд ()? - PullRequest
2 голосов
/ 28 мая 2010

Я использую 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 Ответ

3 голосов
/ 28 мая 2010

Я думаю, что 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 с очень коротким интервалом, они будут иметь одинаковое начальное число и генерировать одинаковую последовательность.

В любом случае, сортировка коллекции по случайному числу не очень хорошая идея, потому что сортировка не будет стабильной и теоретически может длиться вечно. Если вам нужно перемешать результаты, вы можете использовать алгоритм Фишера-Йейтса :

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;
}
...