You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

关键说明

  1. DTO的必要性:避免修改原有Enrollment实体结构,灵活适配DataGrid的展示需求。
  2. 查询优化:通过Include一次性预加载所有关联数据,解决原代码循环查询导致的N+1性能问题。
  3. 异步处理:将同步查询方法改为异步版本(FirstOrDefaultAsync、ToListAsync),符合异步方法的最佳实践。
  4. 空值处理:使用?.运算符处理关联实体为空的情况,避免空引用异常;会议为空时LastMeetingDate会自动设为null。

内容的提问来源于stack exchange,提问作者Bruno Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:46:13