En Linq, busca en una lista utilizando elementos de otra lista.
Tengo una lista de roles que tiene un usuario:
List
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>>);
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: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étodoToList
materializa la consulta en una lista de carpetas.Ten en cuenta que esta consulta asume que
Roles
es una colección de objetosRole
en la claseFolder
. SiRoles
es una colección de IDs de roles, puedes modificar la consulta de la siguiente manera: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.