随机选择查询结果Linq

时间:2016-02-11 03:26:38

标签: c# linq random

我有一个查询,将产生10或20或任意数量的行。以下是查询。

   var q = (from c in session.DB.Question where c.Level='1' && c.Group='1' select c);

此查询可以为我提供任意数量的行。

但我必须在结果中只显示一行。我可以选择前1 /第一,但我想随机选择。

我看到了一个关于此的主题:How to request a random row in SQL? 但我想在LinQ

请帮助我如何从结果中获取随机行。

4 个答案:

答案 0 :(得分:3)

random值对项目进行排序,然后选择第一个:

var q = (from c in session.DB.Question 
         where c.Level =='1' && c.Group =='1' 
         select c)
        .OrderBy(o => SqlFunctions.Rand())
        .First();

答案 1 :(得分:0)

我认为您的问题有ID。请参阅下面的示例。我使用Random类生成随机数。

        List<Question> questions = new List<Question>
        {
            new Question { Id = 10, Name = "What?" },
            new Question { Id = 12, Name = "How?" },
            new Question { Id = 32, Name = "When?" },
            new Question { Id = 41, Name = "Where?" },
        };
        var q = (from c in questions select c);

        int i = 1;
        Dictionary<int, int> questionKeys = new Dictionary<int, int>();

        foreach (var item in questions)
        {
            questionKeys.Add(i, item.Id);
            i++;
        }

        Random rdm = new Random();
        int randomRow = rdm.Next(1, q.Count());

        var questionId = questionKeys.Where(x => x.Key == randomRow).Select(x => x.Value).Single();

        var result = q.Where(x => x.Id == questionId).Single();

        Console.WriteLine(result.Name);

答案 2 :(得分:0)

谢谢大家。我找到并工作了:

        var q = (from c in Session.DB.WinQuestionSet
                 where c.Level == "easy" && c.Grade == "1"
                 select c).OrderBy(x => Guid.NewGuid()).Take(1).Single();
        label1.Text = q.Text;

答案 3 :(得分:-1)

假设data是您的数据行:

Random rand = new Random();
var row = data.ElementAt(rand.Next(data.Count));

请注意,这不适用于Linq to SQL,因此应在查询数据库后使用。