上午,
我想知道如何在LINQ中编写以下SQL语句。
SELECT TOP 6 * FROM Questions
ORDER BY NEWID()
我还想知道,我如何将它绑定到asp.net转发器控件以显示6个问题。
非常感谢:)
答案 0 :(得分:3)
您必须能够调用NEWID()
函数来生成随机指南。为此,您可以获取一些提示here,并首先创建映射到数据上下文中NEWID()
函数的伪方法。
[System.Data.Linq.Mapping.Function(Name="NEWID", IsComposable=true)]
public Guid NewId()
{
throw new NotImplementedException();
}
设置完成后,您可以编写查询以使用此功能:
var query = dc.Questions
.OrderBy(question => dc.NewId())
.Take(6);
您可以检查为此生成的SQL查询,它应该匹配。
答案 1 :(得分:1)
Linq风格将是
Questions.OrderBy(q=>Guid.NewGuid()).Take(6)
然后通过将其DataSource
属性设置为上述内容并调用DataBind
方法将其附加到转发器。
答案 2 :(得分:0)
(from db in context.Questions
order by Guid.NewGuid()
select db).Take(6);
答案 3 :(得分:0)
我知道已经选择了答案,但我仍然在添加自己的方式来实现这一目标。面对同样的情况,今天尝试了几种方式,使用questions.OrderBy(q => Guid.NewGuid()).ToList()
和其他几个建议。之后我想在视图模型中添加一个新字段string RandomOrder
并在循环中分配Guid.NewGuid().ToString()
,然后使用questions.OrderBy(i => i.RandomOrder).ToList()
,这非常有效。
如果作者在创建评估时选择了shuffleAlways
选项,我需要随机播放问题。如果没有,则按常规排序顺序排序。这是完整的解决方案:
private List<AssessmentQuestionsViewModel> LoadAllQuestions(string assessmentId, bool shuffleQuestions)
{
List<AssessmentQuestionsViewModel> questions = new List<AssessmentQuestionsViewModel>();
var items = assessmentQuestionRepository.GetAll().Where(i => i.AssessmentId == assessmentId).ToList();
foreach (var item in items)
{
questions.Add(new AssessmentQuestionsViewModel
{
Id = item.Id,
AssessmentId = item.AssessmentId,
QuestionText = item.QuestionText,
HintText = item.HintText,
QuestionType = item.QuestionType,
MaxMarks = item.MaxMarks,
SortOrder = item.SortOrder,
RandomOrder = Guid.NewGuid().ToString(),
Answers = LoadAllAnswers(item.Id)
});
}
if (shuffleQuestions)
{
questions = questions.OrderBy(i => i.RandomOrder).ToList();
}
else
{
questions = questions.OrderBy(i => i.SortOrder).ToList();
}
return questions;
}
这就像魅力一样。希望这能帮到别人。
答案 4 :(得分:-1)
我假设您使用ORDER BY NEWID()作为从问题中选择随机数据的方法?如果是这样,你应该避免使用NEWID()(或它的LINQ等价物),导致为你的表中的每个记录生成一个新的guid。在一个大型数据集上,这是令人沮丧的。
相反,请参阅Linq Orderby random ThreadSafe for use in ASP.NET以获取随机排序的优化解决方案。然后只需添加一个take运算符和你的集合。
Random random = new Random();
int seed = random.Next();
var RandomQuestions = Questions.OrderBy( s => (~(s.Shuffle & seed)) & (s.Shuffle | seed)); // ^ seed);
return RandomQuestions.Take(6);