LINQ to Entity: Verwendung Enthält in der "select" - Teil wirft unerwarteter Fehler
Habe ich eine LINQ-Abfrage gegen 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, was ich Tue, ist immer eine Reihe von Flotten. Die allianceMembers Liste enthält die Int-Werte aller Benutzer, die verbunden sind mit mir. Ich möchte set isAllied = true, wenn die Flotte der Besitzer ist ein Teil dieser Liste ist, und false sonst.
Wenn ich das Tue, sehe ich eine Ausnahme: "LINQ to Entities erkennt nicht die Methode" Boolean Contains(Int32) "Methode"
Kann ich verstehen, immer diese Fehlermeldung, wenn ich die benutzt hatte, die enthält in der where-Teil der Abfrage, aber warum sollte ich in die Auswahl? Von diesem Punkt würde ich davon ausgehen müsste die Abfrage ausgeführt und zurückgegeben, die Ergebnisse. Dieses kleine Liedchen von code wird nichts eingeengt werden meine Daten an alle.
Irgendwelche Tipps, was ich erreichen kann, was ich brauche, um mit der Einstellung der isAllied Flagge?
Dank
- Es sollte angemerkt werden, dass
Contains
werden unterstützt, die nächste version des Entity Framework
Du musst angemeldet sein, um einen Kommentar abzugeben.
aufrufen
ToList()
auf Flotten die Abfrage ausgeführt wird, können Sie später verwendenContains()
.Dieser pochierte aus einer früheren Antwort...
Enthält nicht unterstützt.
IN und JOIN sind nicht die gleichen Betreiber (Filtern, indem Sie IN sich niemals ändert die Kardinalität eines Abfrage).
Statt es zu tun, so verwenden Sie die join-Methode. Es ist etwas schwierig zu verstehen, ohne mit der query-Operatoren, aber wenn Sie es bekommen, Sie haben es.
Hier ist es mit der query-Operatoren
Grundsätzlich das entity framework versucht zu übersetzen Ihre LINQ-Abfrage in eine SQL-Anweisung, weiß aber nicht, wie man mit den
Contains
.Was können Sie stattdessen tun ist, rufen Sie Ihre Flotten aus der Datenbank, und legen Sie die isAllied Eigenschaft später:
Alle über mir ist falsch!!! (No offense ...) Es funktioniert nicht, weil Sie mit der IList-überladung von "Enthält" und nicht die IEnumerable-überladung von "Enthält". Einfach ändern in:
Indem die
<int>
sagen Sie dem compiler die IEnumerable-überlastung statt, die die IList-überlastung.