微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在ASP.NET MVC中随机提问

如何解决在ASP.NET MVC中随机提问

我有一个ASP.NET MVC网站,它是一个在线测试网站。 我在管理存储库面板中有一个问题。我希望将这些问题随机地问给用户,并将结果存储在数据库中。请帮助

解决方法

可以使用GUID快速而肮脏地进行排序。这可以在视图模型(推荐)中或在带有[NotMapped]列的实体中完成。

例如,给定一个实体,例如:

public class Question 
{
    public int QuestionId { get; set; }
    public string QuestionText { get; set;} 
}

// View Model
[Serializable]
public class QuestionViewModel
{
    public int QuestionId { get; set; }
    public string QuestionText { get; set;} 
    public Guid SortKey { get; } = Guid.NewGuid();
}

然后在加载视图模型时

var questions = context.Questions
    .Select(x => new QuestionViewModel
    {
        QuestionId = x.QuestionId,QuestionText = x.QuestionText
    }).ToList();

return questions.OrderBy(x => x.SortKey);

您可以在实体定义(无数据库列)中使用[NotMapped] SortKey来完成此操作,但是如果采用这种方法,则需要在之前使用ToList 实现应用排序。否则,EF会期望数据库中存在SortKey列,以便转换为SQL。

// Entity
public class Question 
{
    public int QuestionId { get; set; }
    public string QuestionText { get; set;} 
    [NotMapped]
    public Guid SortKey { get; } = Guid.NewGuid();
}


var questions = context.Questions
    .ToList() // Load all questions into memory.
    .OrderBy(x => x.SortKey);

如果要这样做:

var questions = context.Questions
    .OrderBy(x => x.SortKey)
    .ToList();

EF将引发异常,因为SortKey不是数据库中的映射列。我们不希望它出现在数据库中,因为每次读取列表时“随机”顺序都是相同的。

建议使用视图模型方法,以避免需要记住关于实体定义中的列的规则。它还使您在不必将有关问题的一切加载到内存中以应用排序,然后只需要几个值传递给视图。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。