我需要您的帮助。 我在asp.net mvc中创建一个程序。我写了模型类和ViewModel类
public class Student
{
public int StudentId { get; set; }
public string StudentName { get; set; }
public int IndexNumber { get; set; }
public ICollection<Course> Course { get; set; }
}
public class Course
{
public int CourseId { get; set; }
public string CoureName { get; set; }
public int NumberHours { get; set; }
public bool IsExam { get; set; }
public ICollection<Student> Student { get; set; }
}
public class ScheduleVM
{
public string StudentName { get; set; } // Student class
public int IndexNumber { get; set; } // Student class
public string CourseName { get; set; } // Course class
}
ScheduleVM类在上下文类中不存在,我想创建一个仅返回ScheduleVM类中的数据的视图。我手动编写了Schedule控制器并有一个视图。我不知道如何使用EF和Linq将其中一些数据传输到数据库视图? 如果有人有任何指南,请给我发送链接。
编辑:
从ScheduleVM类查看:
@model IEnumerable<StudentApp.Models.ScheduleVM>
<p>
@Html.ActionLink("Create New", "Create")
</p>
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.StudentName)
</th>
<th>
@Html.DisplayNameFor(model => model.IndexNumber)
</th>
<th>
@Html.DisplayNameFor(model => model.CoureName)
</th>
<th>
@Html.DisplayNameFor(model => model.NameInstructor)
</th>
<th>
@Html.DisplayNameFor(model => model.DepartmentName)
</th>
<th></th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.StudentName)
</td>
<td>
@Html.DisplayFor(modelItem => item.IndexNumber)
</td>
<td>
@Html.DisplayFor(modelItem => item.CoureName)
</td>
<td>
@Html.DisplayFor(modelItem => item.NameInstructor)
</td>
<td>
@Html.DisplayFor(modelItem => item.DepartmentName)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
@Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
</td>
</tr>
}
</table>
当然,因为我没有模型,所以foreach循环不起作用。我生成了视图,但是删除了对上下文类的引用。关于控制器,我不知道如何获取所需的数据。
控制器类:
public class ScheduleController : Controller
{
// GET: Schedule
public ActionResult Index()
{
List<ScheduleVM> ScheduleVMlist = new List<ScheduleVM>();
return View();
}
}
我已经将数据添加到了学生和课程表中,现在我想显示所选的信息,但是我不知道如何从数据库中提取这些数据?
public class ModelContext : DbContext
{
public ModelContext()
: base("name=ModelContext")
{}
public DbSet<Student> Students { get; set; }
public DbSet<Course> Courses { get; set; }
}
答案 0 :(得分:0)
一种有效的方法是在实体之间组成查询,然后使用.Select()
填充相关的视图模型。您可以自己填充视图模型,也可以利用Automapper之类的库来帮助处理更复杂或更大的视图模型。现在,AutoMapper提供了一种ProjectTo
扩展方法,可以与EF和IQueryable
很好地配合使用。
例如,如果您进行的搜索旨在列出名称以提供的标准开头的课程:
这假设您要根据课程名称获取学生和课程信息。学生拥有“课程”集合,但是课程没有“学生”集合。
using (var context = new MyContext())
{
var courseIds = context.Courses
.Where(c => c.CourseName.StartsWith(searchText))
.ToList();
var query = context.Students
.Where(s => s.Courses.Any(c => courseIds.Contains(c.CourseId)));
}
现在,我们有了一个IQueryable,它应该给我们所有拥有至少1门匹配课程的学生。我将课程搜索拆分为仅检索匹配课程ID的列表,因为与将条件嵌入以下查询相比,更容易进行匹配。这些可以组合使用,但是如果您有几个不同的条件,则使用这些条件来标识后续查询的ID可能更容易遵循。
没有对数据库运行任何操作。下一步将是,我们希望将结果展平以列出仅包含匹配课程的学生详细信息。如果我们搜索“ Math”,我们只想返回课程,或者为每个符合该模式的学生提供课程。一个学生可能正在参加“数学100”和“数学200”
using (var context = new MyContext())
{
var courseIds = context.Courses
.Where(c => c.CourseName.StartsWith(searchText))
.ToList();
var query = context.Students
.Where(s => s.Courses.Any(c => courseIds.Contains(c.CourseId)));
var viewModels = query.SelectMany( s => s.Courses.Where(c => courseIds.Contains(c.CourseId))
.Select(c => new ScheduleVM
{
StudentName = s.StudentName,
IndexNumber = s.IndexNumber,
CourseName = c.CourseName
})).ToList()
}
这可以压缩为一个Linq查询,但是我将其分开以使其更容易覆盖。第一个“查询”检索了具有匹配课程的学生,但此时该学生的课程列表将是该学生正在修读的所有课程。在此示例中,我们只想列出匹配的课程。因此,从Student中,我们执行SelectMany
以获取课程详细信息,并使用Where
条件仅检索具有匹配ID的课程。从那里,我们对那些匹配的课程进行选择。因为我们仍处于针对该学生的SelectMany
范围之内,所以我们仍然可以访问代表当前学生的“ s”。我们“选择”我们的视图模型,并提供“学生”(“ s”)和“课程”(“ c”)中的相关列。最后的ToList
实际上将触发SQL运行。 EF将组成一个过滤数据的查询,然后仅返回填充视图模型所需的3列。
希望这为您提供了一些有关如何利用EF填充要提供给视图的数据的想法。我建议即使在不显示ID的情况下,也要在其视图模型中包含ID,因为这对于检索相关学生和/或课程,以便根据这些数据进行任何操作非常有用。