2011-04-11 24 views
14

¿Cómo puedo obtener todos los elementos que están en otra lista por ID? Por ejemplo; Tengo roles de lista; Me gustaría obtener todos los roles de la base de datos que están en esta lista por su Id.Obtener una lista de elementos por su ID en el marco de entidad

Estoy usando código primero.

hice esto y tiró un error:

var roles = db.Roles.Where(r => user.Roles.Any(ur => ur.RoleId == r.RoleId)); 

RoleId es de tipo int.

error:

Unable to create a constant value of type 'SampleMVC.Domain.Role'. Only primitive types ('such as Int32, String, and Guid') are supported in this context.

Respuesta

42
var listOfRoleId = user.Roles.Select(r => r.RoleId); 
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId)); 
+0

esta es una llamada a la base de datos? –

+0

En caso afirmativo, verifique el SQL generado o inténtelo en LinqPad –

+0

Si el 'usuario' está cargado y si ha cargado' Roles' será una consulta. –

-1

No se puede combinar con una lista local de datos a distancia, entonces no hay nada para la db para leer desde entonces los datos son elsewere (en el cliente).

Creo que podría haber una mejor solución para lo que estás tratando de hacer;

Parece que está intentando recuperar todas las funciones asignadas a un usuario específico. Si ese es el caso, sugeriría una solución en la que transfiera el ID de usuario actual a la base de datos y obtenga los roles asignados con INNER JOIN.

Dependiendo de su base de datos podría ser algo como esto (si se va a conectar a los usuarios con funciones a través de una tabla llamada '') UserRoles

var roles = db.UserRoles.Where(x => x.UserID == <insert id>).Select(x => x.Role) 

(Por supuesto que también podría crear un procedimiento almacenado que devuelve un lista de 'papel' si te gusta directamente en su base de datos y un mapa Información)

7

Algo como esto debería funcionar si user.Roles es una lista de enteros:.

var roles = db.Roles.Where(r => user.Roles.Contains(r.RoleId)); 

Tha t lo convierte en un "SELECCIONAR DONDE EN (x, y, z ...)" en SQL.

+0

No puedo usar r.RoleId porque Roles es una clase y RoleId es un int. –

+1

¡La idea es buena! Puede insertar un '.Select (ur => ur.RoleId) .' entre' ... usuario.Roles ... 'y' .... Contiene ... '. Tengo curiosidad si la consulta funciona entonces. – Slauma

Cuestiones relacionadas