web-dev-qa-db-fra.com

Obtenir une liste d'éléments par leur ID dans le cadre d'entité

Comment puis-je obtenir tous les éléments qui sont dans une autre liste par ID? Par exemple; J'ai des rôles de liste; Je voudrais obtenir tous les rôles de la base de données qui se trouvent dans cette liste par leur ID.

J'utilise le code en premier.

Je l'ai fait et cela a jeté une erreur:

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

RoleId est de type int.

Erreur:

Impossible de créer une valeur constante de type "SampleMVC.Domain.Role". Seuls les types primitifs ("tels que Int32, String et Guid") sont pris en charge dans ce contexte.

25
Shawn Mclean
var listOfRoleId = user.Roles.Select(r => r.RoleId);
var roles = db.Roles.Where(r => listOfRoleId.Contains(r.RoleId));
64
moi_meme

Quelque chose comme ça devrait fonctionner si user.Roles est une liste d'entrées:

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

Cela le transforme en "SELECT WHERE IN (x, y, z ...)" en SQL.

11
Chris Smith

Vous ne pouvez pas combiner une liste locale avec des données distantes, alors il n'y a rien pour la base de données à lire car les données sont ailleurs (sur votre client).

Je pense qu'il pourrait y avoir une meilleure solution à ce que vous essayez de faire;

Il semble que vous essayez de récupérer tous les rôles attribués à un utilisateur spécifique. Si tel est le cas, je suggère une solution dans laquelle vous transmettez l'ID utilisateur actuel à la base de données et récupérez les rôles attribués avec une INNER JOIN.

Selon votre base de données, cela pourrait ressembler à ceci (si vous connectez des utilisateurs avec des rôles via une table appelée 'UserRoles')

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

(Bien sûr, vous pouvez également créer une procédure stockée renvoyant une liste de "rôles" si vous le souhaitez directement dans votre base de données et la mapper.)

1
Jonas Stensved