我有一个查询,将产生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
请帮助我如何从结果中获取随机行。
答案 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,因此应在查询数据库后使用。