在LINQ中按顺序排序并绑定到Repeater控件

时间:2012-07-23 08:04:46

标签: asp.net linq-to-sql repeater

上午,

我想知道如何在LINQ中编写以下SQL语句。

 SELECT TOP 6 * FROM Questions
 ORDER BY NEWID()

我还想知道,我如何将它绑定到asp.net转发器控件以显示6个问题。

非常感谢:)

5 个答案:

答案 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);