我正在编写一个培训管理系统,需要在一个给定团队中的每个员工的表中显示所有培训课程类型的列表。
对于每个培训课程,我想查看一个预订表,并获得该员工和课程类型组合的最新预订。即使没有预订,我仍然想为每个员工撤回每种课程类型。(尽管预订字段为空)。预订连接到booking.empID到employee.id上的雇员,以及booking.courseId到courseType.id上课程类型的预订链接。
我希望结果按员工分组。
通过在MVC中创建一个视图模型,我成功地做到了这一点,但即使在我的测试数据中,有8名员工,10种课程类型,以及满满的预订,我看到的加载时间为6-7秒。我认为我的观点模型效率很低。
下面是我在VM中使用的类:
public class TeamMemberTraining()
{
public int UserId { get; set; }
public string UserName { get; set; }
public IEnumerable<trainingSet> Trainingset { get; set; }
}
public class trainingSet()
{
public int templateId { get; set; }
public string templateName { get; set; }
public TrainingCourseBooking LastBooking { get; set; }
public TrainingCourseBooking FutureBooking { get; set; }
}我的数据集是以以下方式在我的存储库中构建的:
public List<TeamMemberTraining> GetPersonalHistory(int id)
{
var teamMatrix = new List<TeamMemberTraining>();
var teamMembers = GetProfileIdsByTeam(teamID); //Int list of employee id's
foreach (var teamMemberin teamMembers)
{
var empMatrix = new TeamMemberTraining();
var empRecord = _entities.employees.FirstOrDefault(x => x.Id == emp);
empMatrix.trainingSet = GetPersonalHistory(emp);
empMatrix.UserId = empRecord.Id;
empMatrix.UserName = empRecord.forename + " " + empRecord.surname;
teamMatrix.Add(empMatrix);
}
}
public IEnumerable<trainingSet> GetPersonalHistory(int id)
{
var matrix = new List<trainingSet>();
var courses = (from a in _entities.courseTypes
select a).ToList();
var employee = (from a in _entities.employees
where a.Id == id
select a).FirstOrDefault();
foreach (var course in courses)
{
var matrixItem = new trainingSet
{
templateId = course.Id,
templateName = course.description,
};
var history = (from a in _entities.TrainingCourseBookings
where a.templateId == courseType.Id && a.employeeId == id && a.certificateIssued
orderby a.Id descending
select a).FirstOrDefault();
if (history != null)
{
matrixItem.LastBooking = history;
}
var future = (from a in _entities.TrainingCourseBookings
where a.templateId == courseType.Id && a.employeeId == id && a.TrainingCourse.courseDate >= DateTime.Now
orderby a.Id descending
select a).FirstOrDefault();
if (future != null)
{
matrixItem.FutureBooking = future;
}
matrix.Add(matrixItem);
}
return matrix;
}这给了我所有课程的列表,按用户列出,如果有的话会显示预订情况。它也给了我一整负荷的缓慢加载时间与所有嵌套。
有人能给我提供更好的方法来实现这一点吗?
非常感谢
发布于 2015-06-01 18:27:05
试试这样的东西。
IEnumerable<TrainingSet> GetPersonalHistory(int id)
{
var employee = _entities.employees.FirstOrDefault(e => e.Id == id);
var results =
from course in _entities.courseTypes
let applicableBookings =
from booking in _entities.TrainingCourseBookings
where booking.employeeOd == id
where booking.templateId == course.courseType.Id
orderby booking.Id descending
select booking
let history = applicableBookings.FirstOrDefault(b => b.certificateIssued)
let future = applicableBookings.FirstOrDefault(b => b.TrainingCourse.courseData >= DateTime.Now)
select new TrainingSet
{
TemplateId = course.Id,
TemplateName = course.description,
LastBooking = history,
FutureBooking = future
};
return results.ToList();
}https://stackoverflow.com/questions/30579617
复制相似问题