Bei Verwendung von EntityFramework wird A lambda expression with a statement body cannot be converted to an expression tree
beim Versuch, den folgenden Code zu kompilieren , die Fehlermeldung " " angezeigt :
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2 };
}).ToArray();
Ich weiß nicht, was der Fehler bedeutet und vor allem, wie ich ihn beheben kann. Irgendeine Hilfe?
c#
linq
entity-framework
linq-to-entities
Pistacchio
quelle
quelle
Antworten:
Ist
objects
ein Linq-To-SQL-Datenbankkontext? In diesem Fall können Sie nur einfache Ausdrücke rechts vom Operator => verwenden. Der Grund dafür ist, dass diese Ausdrücke nicht ausgeführt werden, sondern in SQL konvertiert werden, um für die Datenbank ausgeführt zu werden. Versuche diesquelle
Sie können den Anweisungshauptteil im Lamba-Ausdruck für IEnumerable- Sammlungen verwenden. Probier diese:
Hinweis:
Überlegen Sie bei der Verwendung dieser Methode sorgfältig, da auf diese Weise alle Abfrageergebnisse im Speicher gespeichert werden, die möglicherweise unerwünschte Nebenwirkungen auf den Rest Ihres Codes haben.
quelle
AsEnumerable()
das Hinzufügen von Masken verschwindet mein Problem!Dies bedeutet, dass Sie keine Lambda-Ausdrücke mit einem "Anweisungskörper" (dh Lambda-Ausdrücke, die geschweifte Klammern verwenden) an Stellen verwenden können, an denen der Lambda-Ausdruck in einen Ausdrucksbaum konvertiert werden muss (was beispielsweise bei Verwendung von linq2sql der Fall ist). .
quelle
Ohne mehr darüber zu wissen, was Sie tun (Linq2Objects, Linq2Entities, Linq2Sql?), Sollte dies funktionieren:
quelle
.AsEnumerable()
Verwenden Sie diese Überladung von select:
quelle
Expression<Func<Obj,Obj>>
.Das LINQ to SQL-Rückgabeobjekt implementierte eine
IQueryable
Schnittstelle. Daher sollten Sie fürSelect
Parameter für Methodenprädikate nur einen einzelnen Lambda-Ausdruck ohne Körper angeben.Dies liegt daran, dass LINQ für SQL-Code nicht innerhalb eines Programms ausgeführt wird, sondern auf einer Remote-Seite wie SQL Server oder anderen. Dieser verzögerte Ladeausführungstyp wurde durch die Implementierung von IQueryable erreicht, bei dem der erwartete Delegat wie unten in die Ausdruckstypklasse eingeschlossen wird.
Der Ausdrucksbaum unterstützt keinen Lambda-Ausdruck mit body und unterstützt nur einen einzeiligen Lambda-Ausdruck wie
var id = cols.Select( col => col.id );
Wenn Sie also versuchen, funktioniert der folgende Code nicht.
Das Folgende funktioniert wie erwartet.
quelle
Dies bedeutet, dass ein Lambda-Ausdruck vom Typ,
TDelegate
der a enthält,([parameters]) => { some code };
nicht in a konvertiert werden kannExpression<TDelegate>
. Das ist die Regel.Vereinfachen Sie Ihre Anfrage. Die von Ihnen angegebene kann wie folgt umgeschrieben werden und wird kompiliert:
quelle
Ist
Arr
ein Basistyp vonObj
? Existiert die Obj-Klasse? Ihr Code würde nur funktionieren, wenn Arr ein Basistyp von Obj ist. Sie können dies stattdessen versuchen:quelle
Für Ihren speziellen Fall dient der Body zum Erstellen einer Variablen. Wenn Sie zu wechseln,
IEnumerable
werden alle Vorgänge auf clientseitiger Seite verarbeitet. Ich schlage die folgende Lösung vor.Bearbeiten: Umbenennen für C # -Codierungskonvention
quelle