2

早晨,

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

 SELECT TOP 6 * FROM Questions
 ORDER BY NEWID()

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

非常感谢 :)

4

6 回答 6

3

您必须能够调用该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 查询,它应该匹配。

于 2012-07-23T08:36:38.223 回答
3

Linq 风格将是

 Questions.OrderBy(q=>Guid.NewGuid()).Take(6)

DataSource然后通过将其属性设置为上述属性并调用该DataBind方法,将其附加到中继器。

于 2012-07-23T08:12:06.767 回答
1
Questions.OrderBy(q=>Sql.NewGuid()).Take(6)

这将在 SQL 语句中调用 NEWID()。

于 2021-09-18T07:37:43.037 回答
0
(from db in context.Questions
order by Guid.NewGuid()
select db).Take(6);
于 2012-07-23T08:18:38.730 回答
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;
    }

这就像魅力一样。希望这对其他人有帮助。

于 2016-06-24T06:31:46.423 回答
-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);
于 2012-07-23T08:17:29.043 回答