首页 > 解决方案 > 左/右加入 oneToMany 关系 EF 核心

问题描述

我有以下情况:我有一个UsuarioExterno包含导航属性的类List<InscripcionRegistroCurso> Inscripciones

每个InscripcionRegistroCurso类都包含对UsuarioExterno

public class UsuarioExterno : Persona
{
        public int UsuarioExternoId { get; set; }
        [DisplayName("Localidad")]
        public Localidad Localidad { get; set; }
        [DisplayName("Organismo")]
        public string Organismo { get; set; }

        [DisplayName("Sector")]
        public List<InscripcionRegistroCurso> Inscripciones { get; set; }
        public bool SectorPrivado { get; set; }
        [DisplayName("Ocupación")]
        public string Ocupacion { get; set; }

        public UsuarioExterno() : base()
        {
        }
}

public class InscripcionRegistroCurso
{
        public int InscripcionRegistroCursoId { get; set; }
        public Calificacion Calificacion { get; set; }
        public List<Asistencia> Asistencias { get; set; }
        public UsuarioExterno UsuarioExterno { get; set; }
        public Curso Curso { get; set; }
}

public class Curso
{
        public int CursoId { get; set; }
        public string Nombre { get; set; }
        public string Descripcion { get; set; }
}

这是我的 linq 查询

public async Task<List<UsuarioAgenteInscripto>> GetAllUsuariosExternosWithInscripcionToCourseId(int? CourseId)
{
    var query = from u in _context.UsuariosExternos
                join i in _context.InscripcionesRegistrosCursos
                          on u.UsuarioExternoId equals i.UsuarioExterno.UsuarioExternoId
                into inscripcionRegistro
                from inscripcion in inscripcionRegistro.DefaultIfEmpty()
                select new UsuarioAgenteInscripto
                        {
                            Nombre = u.Nombre,
                            Apellido = u.Apellido,
                            Dni = u.DNI,
                            UsuarioExternoId = u.UsuarioExternoId,
                            InscriptoCurso = (inscripcion.Curso != null && inscripcion.Curso.CursoId == CourseId),
                            CursoId = 
                            (inscripcion.Curso != null && inscripcion.Curso.CursoId == CourseId) 
                            ? inscripcion.Curso.CursoId 
                            : -1
                        };

    return await query.Where(ins => ins.CursoId == -1 || ins.CursoId == CourseId).ToListAsync();  
}

此行正在检查用户是否注册了课程。如果该用户有一行InscripcionRegistroCurso,则表示该用户已注册该课程。

InscriptoCurso = (inscripcion.Curso != null && inscripcion.Curso.CursoId == CourseId)

然后CursoId是设置课程的ID,如果它与剃刀页面查询参数中的课程ID相同,则设置它,否则设置-1。

UsuarioAgenteInscripto是一个类,用于收集有关用户 + 特定课程注册的信息。

我在这里想要完成的事情

我有一个用于显示课程(光标)的剃须刀页面,每一行都包含一个按钮(称为注册用户),该按钮触发另一个剃须刀页面并呈现 UsuariosExternos DbSet 中的所有用户。(见附图)我可以通过勾选复选框为用户注册课程。

问题是我需要在一个表中列出所有用户,但我需要确保是否有用户已经注册了课程,应该标记一个复选框来指示这种情况。

https://localhost/Inscripciones/Inscripcion?id=1

Id 是课程 ID。

用户注册示例

我正在做一个正确的加入,以确保列出所有用户,问题是我得到了重复的用户,因为一个用户可以注册几门课程。我需要过滤这种情况并仅显示注册课程的用户,其 courseId 等于当前课程(页面中的课程,查询参数中的课程 ID。)或注册不同课程的用户(但只有一次,不是每次用户注册)如果用户不包含注册,我将 -1 设置为CursoId 每个用户只能注册一次特定的课程。我的意思是用户不能在同一课程中注册两次。

例如,假设我有用户John、Marty 和 Biff,我们在课程 xxxx 的注册页面,课程 ID = 2。

所以我的用户列表应该包含以下内容

名称/名词 CourseId / CursoId isEnrolled / InscriptoCurso
约翰 2 真的
马蒂 -1 错误的
比夫 -1 错误的

但相反有以下

名称/名词 CourseId / CursoId isEnrolled / InscriptoCurso
约翰 2 真的
马蒂 -1 错误的
比夫 -1 错误的
比夫 -1 错误的

我尽力解释情况,如果我需要更多解释,请告诉我。

标签: c#entity-framework-coreasp.net-core-3.1

解决方案


推荐阅读