EF Core中如何将其他类变量添加到List<T>(Radzen Blazor场景)
解决Enrollment列表中添加GroupId和最后会议日期的问题
由于原方法返回的Enrollment实体不包含GroupId和最后会议日期字段,我们需要创建一个自定义数据传输对象(DTO)来承载这些额外信息,同时优化查询性能避免重复数据库请求。
步骤1:创建DTO类
根据DataGrid展示需求,定义包含Enrollment核心信息及额外字段的DTO:
public class MenteeEnrollmentDto { // Enrollment核心字段(按需添加) public int Id { get; set; } public string Role { get; set; } // 关联实体字段(根据实际实体属性调整) public string PersonName { get; set; } public string CourseName { get; set; } // 需要新增的字段 public int GroupId { get; set; } public DateTime? LastMeetingDate { get; set; } }
步骤2:修改并优化查询方法
public async Task<List<MenteeEnrollmentDto>> GetMenteesGroup() { string userId = "1"; var activeYear = await _context.Years.FirstOrDefaultAsync(x => x.IsActive); var myMentees = new List<MenteeEnrollmentDto>(); if (activeYear != null) { // 一次性预加载所有关联数据,避免循环查询数据库 var userEnrollments = await _context.Enrollments .Where(x => x.User.Id == userId && x.YearId == activeYear.YearId) .Include(e => e.Groups) .ThenInclude(g => g.Meetings) // 预加载会议数据 .Include(e => e.Groups) .ThenInclude(g => g.Enrollments) .ThenInclude(en => en.Course) .Include(e => e.Groups) .ThenInclude(g => g.Enrollments) .ThenInclude(en => en.Person) // 关联Person实体,根据实际关系调整 .ToListAsync(); foreach (var userEnrollment in userEnrollments) { // 从已加载的Groups中匹配当前Enrollment所属的Group var group = userEnrollment.Groups.FirstOrDefault(g => g.Enrollments.Any(e => e.Id == userEnrollment.Id)); if (group != null) { var mentee = group.Enrollments.FirstOrDefault(e => e.Role == "Mentee"); if (mentee != null) { // 获取最后一次会议日期(处理会议为空的情况) var lastMeetingDate = group.Meetings .OrderByDescending(m => m.MeetingDate) .Select(m => m.MeetingDate) .FirstOrDefault(); myMentees.Add(new MenteeEnrollmentDto { Id = mentee.Id, Role = mentee.Role, PersonName = mentee.Person?.Name, // 替换为Person实体实际字段名 CourseName = mentee.Course?.CourseName, // 替换为Course实体实际字段名 GroupId = group.GroupId, LastMeetingDate = lastMeetingDate }); } } } } return myMentees; }
关键说明
- DTO的必要性:避免修改原有
Enrollment实体结构,灵活适配DataGrid的展示需求。 - 查询优化:通过
Include一次性预加载所有关联数据,解决原代码循环查询导致的N+1性能问题。 - 异步处理:将同步查询方法改为异步版本(
FirstOrDefaultAsync、ToListAsync),符合异步方法的最佳实践。 - 空值处理:使用
?.运算符处理关联实体为空的情况,避免空引用异常;会议为空时LastMeetingDate会自动设为null。
内容的提问来源于stack exchange,提问作者Bruno Silva
相关产品推荐
相关产品推荐

