我有一个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不是数据库中的映射列。我们不希望它出现在DB中,因为";"随机";每次读取列表时,顺序都是相同的。
建议使用视图模型方法,以避免需要记住关于实体定义中列的类似规则。它还可以更容易地处理不一定要将关于问题的所有内容和相关详细信息加载到内存中以应用排序的情况,然后可能只需要少量值就可以传递到视图。