Esta es mi consulta

 public async Task<IEnumerable<Menu>> GetMenuByRolesAsync(string[] roles)
        {
    var result= await _context.Menus//.Include(o => o.Parent)
                                     .Include(m => m.Childrens)
                                     .ThenInclude(m => m.Childrens)
                                     .Include(m => m.Roles.Where(r => roles.Contains(r.Name)))   --it is not filtering basd on roles                          
                                     .Where(m => m.ParentId == null)
                                     .ToListAsync();
}

Está generando la siguiente consulta

-- @__roles_0='System.String[]' (DbType = Object)
SELECT m.id, m.icon, m.name, m.parent_id, m.url, t.role_id, t.menu_id, t.id, t.concurrency_stamp, t.name, t.normalized_name
FROM security.menu AS m
LEFT JOIN (
    SELECT r.role_id, r.menu_id, r0.id, r0.concurrency_stamp, r0.name, r0.normalized_name
    FROM security.role_menu AS r
    INNER JOIN security.role AS r0 ON r.role_id = r0.id
    WHERE r0.name = ANY (@__roles_0) OR ((r0.name IS NULL) AND (array_position(@__roles_0, NULL) IS NOT NULL))
) AS t ON m.id = t.menu_id
WHERE (m.parent_id IS NULL)
ORDER BY m.id, t.role_id, t.menu_id, t.id

Esta es la configuración de muchos a muchos // muchos a muchos

    builder.HasMany(r => r.Menus)
           .WithMany(r => r.Roles)
           .UsingEntity<RoleMenu>(
              j => j
                  .HasOne(rm => rm.Menu)
                  .WithMany(m => m.RoleMenus)
                  .HasForeignKey(rm => rm.MenuId),
              j => j
                  .HasOne(rm => rm.Role)
                  .WithMany(r => r.RoleMenus)
                  .HasForeignKey(rm => rm.RoleId),
              j =>
              {
                  j.ToTable("role_menu", schema: "security");                                                 
                  j.HasKey(rm => new { rm.RoleId, rm.MenuId });
              });

Necesito filtrar menús en función de los roles ... pero no se filtra en función de los roles ... Estoy obteniendo todos los roles ... Verifiqué la consulta generada ... Por favor, avíseme cuál es el problema ...

1
Ajt 20 ene. 2021 a las 09:36

1 respuesta

La mejor respuesta

Está mezclando la inclusión filtrada con el filtrado de entidades.

Incluido filtrado

.Include(m => m.Roles.Where(r => roles.Contains(r.Name)))

Simplemente filtra los elementos de la colección relacionada (roles de menú en este caso).

Para filtrar el conjunto de entidades (menús en este caso), debe reemplazarlo con el oparador Where habitual, que para el filtrado deseado será

.Where(m => m.Roles.Any(r => roles.Contains(r.Name)))
2
Ivan Stoev 20 ene. 2021 a las 07:11