es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En Linq, busca en una lista utilizando elementos de otra lista.

Tengo una lista de roles que tiene un usuario:


List rolesUsuario; // esta es una lista de roles

Luego tengo carpetas que tienen uno o más roles asociados y se puede acceder a través de Folders.Roles.

Quiero devolver una lista de carpetas que coincidan con un campo en las carpetas y también tengan un rol en la lista de roles hijas que está en la lista de roles del usuario.

Básicamente puedo hacer lo que quiero usando algunos bucles foreach …

bool tieneRol = false;
List<Carpeta> carpetas2 = _customerPortalDbContext.Carpeta.Where(c => c.IdCarpetaPadre == Guid.Empty).ToList();
foreach(Carpeta c in carpetas2)
{
    foreach (Rol rol in c.Roles)
    {
        if (rolesUsuario.Any(r => r.Id == rol.Id)) tieneRol = true;
    }
}

Pero siento que he visto o hecho algo similar en el pasado usando algún código de Linq ingenioso, así que espero que esto sea posible. Algo como

IQueryable<Carpeta> carpetas = _customerPortalDbContext.Carpeta.Where(c => c.TipoCarpeta == "TipoDeCarpeta") 
                                                               && c.Roles.IdRol.<<Comparar con roles en la lista de roles>>);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible lograr el resultado deseado utilizando LINQ. Puede utilizar el método Any para verificar si alguno de los roles en la carpeta coincide con los roles en la lista de userRoles. Aquí tienes un ejemplo de consulta:

    var folders = _customerPortalDbContext.Folders
        .Where(f => f.FolderType == "FolderType" && f.Roles.Any(r => userRoles.Any(ur => ur.Id == r.Id)))
        .ToList();
    

    Esta consulta devolverá todas las carpetas de tipo “FolderType” que tienen al menos un rol que coincide con los roles en la lista de userRoles. El método Any verifica si algún elemento en la secuencia cumple con la condición especificada. En este caso, estamos verificando si algún rol en la carpeta coincide con algún rol en la lista de userRoles basado en el ID del rol. El método ToList materializa la consulta en una lista de carpetas.

    Ten en cuenta que esta consulta asume que Roles es una colección de objetos Role en la clase Folder. Si Roles es una colección de IDs de roles, puedes modificar la consulta de la siguiente manera:

    var folders = _customerPortalDbContext.Folders
        .Where(f => f.FolderType == "FolderType" && f.Roles.Any(r => userRoles.Any(ur => ur.Id == r)))
        .ToList();
    

    En este caso, estamos verificando si algún ID de rol en la colección Roles de la carpeta coincide con algún ID de rol en la lista de userRoles.

Comments are closed.