2

私はLinqToNhibernateを使用しており、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

LinqtoNHibernateはRandom.Next呼び出しをSQLに変換できないと思います...

オプションは、DBから結果を取得した後に結果を並べ替えることです。

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 に答える