Frage

Ich habe eine LINQ-Abfrage geht gegen ein Entity Framework Objekt bekommt. 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 eine Reihe von Flotten zu bekommen. Die allianceMembers Liste enthält INTs aller Benutzer, die mit mir verwandt sind. Ich möchte gesetzt isAllied = true, wenn die Flotte Eigentümer Teil dieser Liste enthalten ist, und andernfalls false.

Wenn ich das tue, sehe ich eine Ausnahme: „LINQ to Entities erkennt nicht die Methode‚Boolean Enthält (Int32)‘Methode“

kann ich verstehen, diesen Fehler, wenn ich das enthält in dem in dem Teil der Abfrage verwendet hatte, aber warum sollte ich es in der Auswahl bekommen? An diesem Punkt würde ich davon ausgehen, die Abfrage die Ergebnisse ausgeführt und zurückgegeben würde. Dieses kleine Liedchen von Code tut nichts, um meine Daten überhaupt zu beschränken.

Irgendwelche Tipps, wie sonst kann ich erreichen, was ich brauche, um mit den isAllied-Flags?

Danke

War es hilfreich?

Lösung

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

Aufruf ToList() auf Flotten die Abfrage ausgeführt wird, später können Sie Contains() verwenden.

Andere Tipps

Dieses pochiertem aus einer früheren Antwort ...

Enthält nicht unterstützt.

IN und JOIN sind nicht die gleichen Operator (Filterung nach IN ändert sich nie die Mächtigkeit der Abfrage).

Statt es auf diese Weise tun, verwenden Sie die Methode beitreten. Es ist etwas schwierig, ohne Verwendung der Abfrageoperatoren zu verstehen, aber wenn Sie es erhalten, haben Sie es.

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 wird mit Hilfe der Abfrageoperator

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

Grundsätzlich ist die Entity Framework versucht, Ihre LINQ-Abfrage in eine SQL-Anweisung zu übersetzen aber nicht weiß, wie die Contains zu behandeln.

Was können Sie stattdessen tun ist Ihre Flotten aus der Datenbank abrufen und die isAllied Eigenschaft später:

var fleets = (from af in FleetSource
              select new Fleet 
              {
                  fleetID = af.fleetID,
                  fleetName = af.fleetName,
                  userId = af.userId
              }).AsEnumerable();

foreach (var fleet in fleets)
{
    fleet.isAllied = (allianceMembers.Contains(fleet.userID) ? true : false);
}

Jeder über mir ist falsch !!! (Nichts für ungut ...) Es funktioniert nicht, weil Sie die IList Überlastung verwenden „Enthält“ und nicht die IEnumerable Überlastung von „enthält“. Ändern Sie einfach an:

allianceMembers.Contains<int>(af.userID)

die <int> Durch das Hinzufügen Sie sagen dem Compiler die IEnumerable Überlastung statt der IList Überlastung zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top