LINQ中子查询的随机顺序

本文关键字:随机 顺序 查询 LINQ | 更新日期: 2023-09-27 17:54:49

我有三个实体框架对象:Quiz、Question和Option。Quiz有一组Question对象,而Question有一组Option对象。我想从DBContext返回一个指定测验的随机问题列表,每个问题应该包括一个随机排序的相关选项集合。

到目前为止,我已经能够成功地获得随机问题列表,但是我在随机选择问题的选项时遇到了麻烦。

注意:我已经编写了几个不同的洗牌扩展方法,在这个例子中,为了简单起见,我使用了Guid排序。

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

如何随机洗牌选项?

LINQ中子查询的随机顺序

我不确定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;

。只需随机生成一些唯一的问题行号,并获取相应的行。

警告!使用前需要优化-这是一个脏代码原型