LINQ to Entity: l'utilisation de Contains dans la partie "select" renvoie une erreur inattendue

c# entity-framework linq-to-entities

Question

Une requête LINQ va à l'encontre d'un objet Entity Framework. Voici un résumé de la requête:

//a list of my allies
List<int> allianceMembers = new List<int>() { 1,5,10 };

//query for fleets in my area, including any allies (and mark them as such)
var fleets = from af in FleetSource
             select new Fleet 
             {
                 fleetID = af.fleetID,
                 fleetName = af.fleetName,
                 isAllied = (allianceMembers.Contains(af.userID) ? true : false)
             };

Fondamentalement, ce que je fais, c'est obtenir un ensemble de flottes. La liste allianceMembers contient les INT de tous les utilisateurs qui sont alliés avec moi. Je souhaite définir isAllied = true si le propriétaire de la flotte fait partie de cette liste et false sinon.

Lorsque je fais cela, je vois une exception: "LINQ to Entities ne reconnaît pas la méthode" Boolean Contains (Int32) "method"

Je peux comprendre que cette erreur se produise si j’ai utilisé la propriété contient dans la partie où de la requête, mais pourquoi l’obtenir dans la sélection? À ce stade, je suppose que la requête aurait exécuté et renvoyé les résultats. Ce petit bout de code ne fait rien pour contraindre mes données.

Des conseils sur la manière dont je peux accomplir ce dont j'ai besoin en paramétrant le drapeau isAllied?

Merci

Réponse acceptée

var fleets = from af in FleetSource;

var x = from u in fleets.ToList()
                         select new Fleet
                         {
                            fleetID = u.fleetID,
                            fleetName = u.fleetName,
                            isAllied = (allianceMembers.Contains(u.userID) ? true : false)
                         }

appeler ToList() sur les flottes où la requête est exécutée, vous pouvez utiliser ultérieurement Contains() .


Réponse populaire

Ce poché d'une réponse précédente ...

Contient non pris en charge.

IN et JOIN ne sont pas le même opérateur (Filtrer par IN ne change jamais la cardinalité de la requête).

Au lieu de procéder ainsi, utilisez la méthode join. C'est un peu difficile à comprendre sans utiliser les opérateurs de requête, mais une fois que vous l'obtenez, vous l'avez.

var foo = 
model.entitySet.Join(  //Start the join
values, //Join to the list of strings
e => e.Name, // on entity.Name
value => value, //equal to the string
(ModelItem ent, String str) => ent);//select the entity

Ici, il utilise les opérateurs de requête

var foo = from e in model.entitySet
join val in values on
e.Name equals val
select e;


Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow