【问题标题】:ASP.NET MVC C# list inside list列表中的 ASP.NET MVC C# 列表
【发布时间】:2022-01-09 15:16:56
【问题描述】:

我正在使用 ASP.NET MVC 来让用户参加考试,每个考试都包含一个问题列表,每个问题都包含多个答案以形成一个选择题。这是我的模型

 public class Exam
{
    [Key]
    public string ExamID { get; set; }
    public string Name { get; set; }
    public Class Class { get; set; }
    public int Time { get; set; }
    public DateTime Deadline { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
    
    public bool Suffer { get; set; }
}
public class Question
{
    public int ID { get; set; }
    public string question { get; set; }
    public ICollection<String> Answer { get; set; }
    public int CorrectAns { get; set; }
}

当我创建包含多个问题的考试时似乎很好,但是当我想从问题中获取答案列表时,它会为我的答案列表返回 null。C# 是否允许将列表放入列表中,或者它来自另一个列表问题?

这是我在控制器中使用的创建和获取考试的代码: [HttpPost]

    public JsonResult Create(Exam exam,string ClassID)
    {
        if (exam.Time.ToString()!=null  ||exam.Deadline==null)
        {
            exam.Deadline = new DateTime(1990,1,1);
        }       
        Class @class = db.Classes.FirstOrDefault(x => x.ClassID == ClassID);          
        exam.Class = @class;
        exam.ExamID = ClassID +exam.Name;
        db.Exams.Add(exam);
        int a=db.SaveChanges();    
        return Json(a);
    } 
 public ActionResult Details(string id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        Exam exam = db.Exams.Find(id);
 
        if (exam == null)
        {
            return HttpNotFound();
        }
        foreach(Question question in exam.Questions)
        {
            Debug.WriteLine(question.Answer.Count);
        }

我使用 Debug.WriteLine 来检查是否有任何有问题的答案字符串,并在这一步返回 null

【问题讨论】:

  • 你能告诉我们你用来访问列表的代码吗?
  • 是的,您可以拥有一个列表列表。您能否展示创建考试然后尝试提取答案列表的代码?
  • 我在帖子中编辑并添加了我的代码
  • 看起来你只是在访问对象本身而不是关系尝试使用 .Include() .Include(blog =&gt; blog.Posts) docs.microsoft.com/en-us/dotnet/api/…
  • 试图用 Exam = db.Exams.Include(x => x.Questions).FirstOrDefault(x => x.ExamID == id);但它给出了同样的问题

标签: c# asp.net-mvc list


【解决方案1】:

您似乎使用了急切加载。所以你必须使用 Include 方法。 为了获得多层次的深度,您必须在 Include 方法之后使用 ThenInclude。

db.Exams.Include(x => x.Questions).ThenInclude(y => y.Answers).FirstOrDefault(x => x.ExamID == id);

官方文档:https://docs.microsoft.com/en-us/ef/core/querying/related-data/

【讨论】:

  • 已经找了一个小时但是找不到 ThenInclude(),我该如何使用那个方法?
  • 它与 Include 属于同一类。 EntityFrameworkCore => EntityFrameworkQueryableExtensions
  • 即使使用 Then Include... 仍然无法解决问题。
  • 在您的模型中。你有 ICollection 答案。您必须创建类答案并制作 ICollection 答案。答案将具有属性 Id 和 Title 以及外键 Question_id。
猜你喜欢
  • 2018-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
相关资源
最近更新 更多