LINQ中子查询的随机Orderby

时间:2013-01-18 21:06:50

标签: c# linq

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

到目前为止,我已经能够成功地获得随机问题列表,但是我无法随机选择问题的选项。

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

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

如何随机随机播放选项?

1 个答案:

答案 0 :(得分:0)

我不确定LINQ-to-SQL是否支持转换此类特定功能。在你的靴子中,如果我有权访问数据库,我会创建一个类似于描述here的存储过程来获取数据库级别的随机行。但是,这也是一个非最佳解决方案(参见this question的接受答案)

您可以采用以下方法(假设您的问题少于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;

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

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