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();
    }