早晨,
我想知道如何在 LINQ 中编写以下 SQL 语句。
SELECT TOP 6 * FROM Questions
ORDER BY NEWID()
我还想知道,如何将它绑定到 asp.net 转发器控件以显示 6 个问题。
非常感谢 :)
早晨,
我想知道如何在 LINQ 中编写以下 SQL 语句。
SELECT TOP 6 * FROM Questions
ORDER BY NEWID()
我还想知道,如何将它绑定到 asp.net 转发器控件以显示 6 个问题。
非常感谢 :)
您必须能够调用该NEWID()
函数来生成随机向导。为此,您可以在此处获取一些提示,并首先创建一个伪方法映射到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 查询,它应该匹配。
Linq 风格将是
Questions.OrderBy(q=>Guid.NewGuid()).Take(6)
DataSource
然后通过将其属性设置为上述属性并调用该DataBind
方法,将其附加到中继器。
Questions.OrderBy(q=>Sql.NewGuid()).Take(6)
这将在 SQL 语句中调用 NEWID()。
(from db in context.Questions
order by Guid.NewGuid()
select db).Take(6);
我知道答案已经被选中,但我仍然在添加我的方法来实现这一点。今天面临同样的情况并尝试了几种方法,使用过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;
}
这就像魅力一样。希望这对其他人有帮助。
我假设您使用 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);