7
votes

Linq aux entités ne reconnaît pas l'exception méthode

J'ai quelque chose comme celui-ci

SecuritySearcher sc = new SecuritySearcher();
Dictionary<string, bool> groupsMap = 
    sc.GetUserGroupMappings(domainName, currentUser, distGroups.ToList());

IQueryable<HotelTravel> groupq = 
    (from hotel in qHs
    join hp in qHps on hotel.HotelTravelId equals hp.HotelTravelId
    where !string.IsNullOrEmpty(hp.GroupName)
       && groupsMap.ContainsKey(hp.GroupName) 
       && groupsMap[hp.GroupName] == true
    select hotel);


2 commentaires

Dupliqué possible de Linq to entité framework: Utilisez le dictionnaire dans la requête


@jrummell: Ce n'est pas un duplicata de la question que vous connaissez car il utilise des dictionnaires d'une manière différente.


3 Réponses :


3
votes

Vous n'êtes pas autorisé à utiliser votre dictionnaire dans la clause O quelle que soit la clause de résultat, car Linq to entités tentera de la transformer en SQL et de ne pas savoir comment gérer la collection de dictionnaires.

Voir ce lien: Linq to entité framework: Utilisez le dictionnaire dans la requête


0 commentaires

9
votes

Afin de traduire votre expression en une requête de base de données, la base de données doit en quelque sorte connaître le contenu de votre dictionnaire et avoir un moyen d'y accéder de la requête. Il n'y a pas de mécanisme de dictionnaire dans SQL, mais cela n'a pas d'importance, car vous n'avez pas besoin d'un dictionnaire, car vous recherchez simplement des clés dont la valeur est une certaine constante. Vous pouvez transformer cet ensemble de clés dans une liste et voir si cette liste contient ce que vous recherchez:

var groupsList = (from kvp in groupsMap     // find all keys in groupsMap
                  where kvp.Value == true   // where the value is set to True
                  select kvp.Key).ToList();

IQueryable<HotelTravel> groupq =
    from hotel in qHs
    join hp in qHps on hotel.HotelTravelId equals hp.HotelTravelId
    where !string.IsNullOrEmpty(hp.GroupName)
          && groupsList.Contains(hp.GroupName)
    select hotel;


3 commentaires

Bonjour merci pour une lecture rapide mais je reçois cette exception maintenant Linq aux entités ne reconnaît pas la méthode 'System.Collections.Generic.List 1 [System.string] Tolist [String] (System.Collections.Generic.Inédecable < / CODE> 1 [SYSTE M.String]) 'Méthode, et cette méthode ne peut pas être traduite dans une expression de magasin.


Désolé, mais j'aurais dû mettre la liste de la liste dans une déclaration distincte. Vous pouvez voir de ma réponse modifiée comment faire cela maintenant.


@PavanJosyula: Vous devez accepter la réponse si cela vous a aidé.



6
votes

J'ai eu le même problème. La solution la plus facile consiste à remplacer la méthode xxx

avec la méthode avec la même fonctionnalité reconnue par Linq aux entités: xxx

comme le Répondez ici dit, ces deux Les fonctions font exactement la même chose.


0 commentaires