LINQ to Entity: Die Verwendung von "Enthält" im Abschnitt "Auswählen" löst einen unerwarteten Fehler aus

c# entity-framework linq-to-entities

Frage

Ich habe eine LINQ-Abfrage für ein Entity Framework-Objekt. Hier ist eine Zusammenfassung der Abfrage:

//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)
             };

Im Grunde bekomme ich eine Reihe von Flotten. Die allianceMembers-Liste enthält INTs aller Benutzer, die mit mir verbündet sind. Ich möchte isAllied = true setzen, wenn der Besitzer der Flotte Teil dieser Liste ist, andernfalls false.

Wenn ich dies tue, sehe ich eine Ausnahme: "LINQ to Entities erkennt die Methode" Boolean Contains (Int32) "nicht."

Ich kann es verstehen, diesen Fehler zu erhalten, wenn ich die Inhalt in dem Abschnitt der Abfrage verwendet habe. Warum sollte ich ihn jedoch im Auswahlbereich erhalten? Zu diesem Zeitpunkt würde ich davon ausgehen, dass die Abfrage ausgeführt und die Ergebnisse zurückgegeben hätte. Dieser kleine Code-Code wirkt sich nicht auf meine Daten aus.

Irgendwelche Tipps, wie ich sonst mit dem Setzen des isAllied-Flag alles erreichen kann?

Vielen Dank

Akzeptierte Antwort

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)
                         }

Beim Aufruf von ToList() für Flotten wird die Abfrage ausgeführt. Später können Sie Contains() .


Beliebte Antwort

Das pochierte aus einer früheren Antwort ...

Enthält nicht unterstützt.

IN und JOIN sind nicht derselbe Operator (Durch das Filtern nach IN wird die Kardinalität der Abfrage nie geändert).

Verwenden Sie stattdessen die join-Methode. Ohne die Abfrageoperatoren ist es etwas schwer zu verstehen, aber sobald Sie es verstanden haben, haben Sie es verstanden.

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

Hier werden die Abfrageoperatoren verwendet

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum