我有一些来自旧数据库的旧表,我试图用它来填充View Model。控制器操作在一个旧表中查找电子邮件与当前用户电子邮件匹配的记录,然后根据从这些匹配派生的列表填充视图模型。这是我的控制器动作:
public PartialViewResult OldCourses()
{
var email = User.Identity.GetEmail();
var reglist = nb.old_register
.Where(i => i.email == email).ToList();
if (reglist != null)
{
var viewModel = new OldCourseViewModel();
foreach (var reg in reglist)
{
viewModel.StudentID = reg.studentid;
viewModel.CourseTitle = nb.old_courses.FirstOrDefault(j => j.courseid == nb.old_Cohorts.FirstOrDefault(h => h.cohortname == reg.cohort).modulename).coursetitle;
viewModel.Cohort = reg.cohort;
viewModel.Progpct = nb.student_progress.FirstOrDefault(k => k.studentid == reg.studentid).percentage;
};
return PartialView("OldCourses", viewModel);
}
viewModel.Progpct可能返回null,因为student_progress表中可能没有reglist中每条记录的条目。这意味着我收到错误,对象引用未设置为对象的实例。
视图模型如下:
public class OldCourseViewModel
{
public int StudentID { get; set; }
public string CourseTitle { get; set; }
public string Cohort { get; set; }
public decimal? Progpct { get; set; }
public string icon_class { get; set; }
public string icon_colour_class { get; set; }
public string titleabbrev { get; set; }
}
旧表中的字段'百分比'如下:
public Nullable<decimal> percentage { get; set; }
没有旧表具有外键关系,我无法以任何方式更改任何表。
我很欣赏foreach循环无法处理null,即使该字段在View Model中可以为空。
我的第一个问题是处理这种情况的最佳方法是什么,以便当该字段为空时可以返回null?
我的第二个问题是,如果reglist中有多个记录,我如何让foreach循环循环遍历reglist中的每个记录,并在视图模型中为reglist中的每个记录生成一条新记录?
编辑 - 根据斯蒂芬的建议,我做了以下事情:
var pctcheck = nb.student_progress.FirstOrDefault(k => k.studentid == reg.studentid);
if (pctcheck != null)
{
viewModel.Progpct = pctcheck.percentage;
}
这正确回答了我的第一个问题。斯蒂芬还在评论中正确回答了我的第二个问题。
接受的答案是完成我的第一个问题的最佳方式,而不是我使用的上述问题:
viewModel.Progpct = nb.student_progress.FirstOrDefault(k => k.studentid == reg.studentid)?.percentage;
哪个使用?运算符与if null检查执行相同的工作。
答案 0 :(得分:2)
对于第一个问题,即使您修复了它,您也可以在新版本的c#中使用?.
运算符
viewModel.Progpct = nb.student_progress.FirstOrDefault(k => k.studentid == reg.studentid)?.percentage;
在旧版本中,您可以使用
viewModel.Progpct = nb.student_progress.Where(k => k.studentid == reg.studentid).Select(m => (decimal?)m.percentage).FirstOrDefault();
对于第二个问题,你可以用这样的东西进行简化。
您的模型将是IEnumerable<OldCourseViewModel>
var email = User.Identity.GetEmail();
var model = nb.old_register.Where(i => i.email == email)
.Select(reg => new OldCourseViewModel {
StudentID = reg.studentid,
CourseTitle = nb.old_courses.FirstOrDefault(j => j.courseid == nb.old_Cohorts.FirstOrDefault(h => h.cohortname == reg.cohort)?.modulename)?.coursetitle;
Cohort = reg.cohort,
Progpct = nb.student_progress.FirstOrDefault(k => k.studentid == reg.studentid)?.percentage
});
return PartialView("OldCourses", model);