3

Quiz、Question、および Option という 3 つのエンティティ フレームワーク オブジェクトがあります。Quiz には Question オブジェクトのコレクションがあり、Question には Option オブジェクトのコレクションがあります。指定されたクイズの質問のランダム化されたリストから戻りたいと思いDBContextます。各質問には、関連するオプションのランダムに並べ替えられたコレクションが含まれている必要があります。

これまでのところ、質問のランダムなリストを正常に取得できましたが、質問のオプションをランダム化するのに問題があります。

注: 私はいくつかの異なるシャッフル拡張メソッドを作成しました。この例では、わかりやすくするために Guid による順序付けを使用しています。

var questions = db.Questions.Where(q => q.QuizId == quizId).Include(q => q.Options).OrderBy(a => Guid.NewGuid());

オプションをランダムにシャッフルするにはどうすればよいですか?

4

1 に答える 1

0

LINQ-to-SQL がそのような特定の機能の変換をサポートするかどうかはわかりません。あなたのブートで、データベースにアクセスできる場合は、ここで説明されているようなストアド プロシージャを作成して、データベース レベルでランダムな行をフェッチします。ただし、これも最適な解決策ではありません(この質問に対する受け入れられた回答を参照してください)

次のアプローチを取ることができます (MAXINT 未満の質問があると仮定します)。

Random random;
var c = Questions.Count();

var randomNumbers = new List<int>();
var fetchedQuestions = new List<Question>();
var randomNumber = random.Next(1,c);

for (int i = 0; i < maxQuestions; i++) {
    while (randomNumbers.Contains(randomNumber))
        randomNumber = random.Next(1,c);
    randomNumbers.Add(randomNumber);
    fetchedQuestions.Add(Questions.ElementAt(randomNumber));
}
return fetchedQuestions;

つまり、いくつかのランダムな一意の質問行番号を生成し、対応する行をフェッチするだけです。

警告!使用前に最適化が必要 - これはダーティ コード プロトタイプです。

于 2013-01-22T10:30:07.063 に答える