SQL 用于显示集合的视图,以及员工的任何相关记录
SQL view for displaying a collection, with any associated related records by employee
我正在编写一个培训管理系统,需要为给定团队中的每位员工显示 table 中举办的所有培训课程类型的列表。
对于这些培训课程中的每一个,我想查看预订 table 并获取该员工和课程类型组合的最新预订。即使不存在预订,我仍然想为每位员工撤回每种课程类型。 (尽管预订字段为空)。预订在 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;
}
这为我提供了所有课程的列表,按用户列出,如果存在则显示预订。它还给我带来了所有嵌套的缓慢加载时间。
谁能给我提供更好的方法来实现这个目标?
非常感谢
尝试这样的事情。
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();
}
我正在编写一个培训管理系统,需要为给定团队中的每位员工显示 table 中举办的所有培训课程类型的列表。
对于这些培训课程中的每一个,我想查看预订 table 并获取该员工和课程类型组合的最新预订。即使不存在预订,我仍然想为每位员工撤回每种课程类型。 (尽管预订字段为空)。预订在 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;
}
这为我提供了所有课程的列表,按用户列出,如果存在则显示预订。它还给我带来了所有嵌套的缓慢加载时间。
谁能给我提供更好的方法来实现这个目标?
非常感谢
尝试这样的事情。
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();
}