Erstellen Sie ein Tupel in einem Linq Select
Ich arbeite mit C# und .NET Framework 4.5.1 abrufen von Daten aus einer SQL Server-Datenbank mit Entity Framework 6.1.3.
Habe ich dieses:
codes = codesRepo.SearchFor(predicate)
.Select(c => new Tuple<string, byte>(c.Id, c.Flag))
.ToList();
Und wenn ich es laufen lasse, bekomme ich diese Meldung:
Nur parameterlose Konstruktoren und Initialisierungen werden unterstützt LINQ
zu Personen.
Ich weiß nicht, wie ich habe zum erstellen der Tupel, denn alle Beispiele, die ich gefunden habe sind meistens wie diese.
Ich habe dies ausprobiert:
codes = codesRepo.SearchFor(predicate)
.Select(c => Tuple.Create(c.Id, c.Flag))
.ToList();
Und bekomme diese Fehlermeldung:
LINQ to Entities erkennt nicht die Methode
'System.Tupel`2[System.String,System.Byte]
Erstellen[String,Byte](System.String, Byte)' - Methode, und diese Methode
kann nicht übersetzt werden, in einen laden zu Ausdruck.
Wo ist das problem?
InformationsquelleAutor der Frage VansFannel | 2015-11-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während der Antwort von octavioccl funktioniert, ist es besser, erste Projekt, das Ergebnis der Abfrage in anonymen Typ, und wechseln Sie dann zu Durchlaufen und wandelt es in ein Tupel. Auf diese Weise wird die Abfrage abrufen aus der Datenbank nur die Felder benötigt.
InformationsquelleAutor der Antwort Ivan Stoev
Versuchen Sie dies:
Informiert worden, dies ist nicht zu akzeptieren in LINQ to entities.
Eine andere Möglichkeit ist, ziehen Sie das Ergebnis in den Speicher vor der Wahl. Wenn Sie dieses tun, würde ich empfehlen, tun alle filtern, bevor die .AsEnumerable (), da es bedeutet, Sie sind nur zurückziehen Ergebnisse, die Sie wollen, im Gegensatz zu ziehen die gesamte Tabelle und dann filtern.
als auch Tupel.Erstellen(c.Id.c.Flag) verändert werden könnte, um neues Tupel(c.Id.c.Flag), wenn Sie möchten, um den code ein bisschen mehr explizit in den Tupel-Typen
InformationsquelleAutor der Antwort Dhunt
In linq to entities können Sie projizieren auf einen anonymen Typ oder auf ein DTO.Um zu vermeiden, dass die Ausgabe, die Sie verwenden können
AsEnumerable
extension Methode:Dieser Methode können Sie die Arbeit mit Linq to Object statt Linq to Entitiesso nach nennen,Sie kann das Ergebnis Ihrer Abfrage in was auch immer Sie brauchen.Der Vorteil der Verwendung
AsEnumerable
stattToList
ist, dassAsEnumerable
nicht die Abfrage ausführen, werden Sie bewahrt die verzögerte Ausführung. Es ist eine gute Idee, filtern Sie immer zuerst Ihre Daten vor dem Aufruf einer dieser Methoden.InformationsquelleAutor der Antwort octavioccl
Habe ich die Antwort gefunden:
InformationsquelleAutor der Antwort VansFannel
Verwenden Sie diese Methode, um dies zu tun, und verwenden Sie die async.
InformationsquelleAutor der Antwort MohammadSoori