2013-03-18 18 views
5

Ein Projekt nur von Linq to SQL-geschaltet LINQ-to-Entities, und jetzt bekomme ich die FehlerDer LINQ-Ausdrucksknotentyp 'ArrayIndex' wird in LINQ to Entities nicht unterstützt. sondern wird von Linq to SQL unterstützt

The LINQ expression node type 'ArrayIndex' is not supported in LINQ to Entities. 

für diese Linie:

var a = db.Table.Single(d => d.Date == dates[0]); 

(Fixing es in diesem Fall einfach ist, wie in

var firstDate = dates[0]; 
var a = db.Table.Single(d => d.Date == firstDate); 

)

Aber warum funktioniert das in linq-to-sql, aber nicht in linq-to-entities? Haben sie linq-to-entities schlechter als linq-to-sql gemacht? Was fehlt mir?

+2

LINQ to SQL und LINQ to Entitäten werden vollständig getrennt entwickelt, es gibt hier keinen relevanten gemeinsamen Code. Es erfordert zusätzliche Unterstützung in LINQ to SQL für etwas, das auf den ersten Blick keinen Sinn ergibt (es sieht so aus, als würden Sie versuchen, "Daten" als Array-Parameter zu übergeben und den Server das erste Element lesen lassen). Ich vermute, dass es nicht sehr häufig verwendet wird und aus diesem Grund einfach nie für LINQ to Entities in Betracht gezogen wurde. Da dies eine Vermutung ist, werde ich es nicht als Antwort veröffentlichen. – hvd

+0

Es sieht aus wie ein Fehler für mich. Der Ausdrucksbaum sollte zuerst in die einfachsten Ausdrücke aufgelöst werden, bevor er in SQL übersetzt wird. Dies ist im Wesentlichen das, was @dontomaso durch die Vorbewertung von Daten [0] tut, aber nicht manuell tun sollte (besonders für einen so einfachen Ausdruck). – Ackroydd

Antwort

2

Das ist, weil L2E nur versucht, Ihre Abfrage in einen SQL-Befehl zu übersetzen. Daher führen alle zusätzlichen Dinge (Methoden wie .ToString() und andere Dinge, die nicht in SQL übersetzt werden können) zu dieser Ausnahme.

Allerdings L2S wie LINQ zu Objekten implementiert IEnumerable. Daher ist das Ziel von ihnen anders: L2E, um linq-Abfragen in SQL-Befehle zu übersetzen, L2O, um mit IEnumerable-Objekten im Speicher zu arbeiten, und L2S, um mit einer Datenbank zu modellieren und zu arbeiten.

Wenn nun will in der Lage sein, Ihre L2S zu verwenden, um Abfragen in Ihrem EF-Projekt (mit L2E), sollten Sie zunächst Ihre Daten von Ihnen abgerufen konvertieren DbContext zu IEnumerable:

var a = db.Table.AsEnumerable().Single(d => d.Date == dates[0]); 
// or any other methods... 
+2

Bringt alle Daten von der Datenbank in den Speicher ist keine Idee. Der richtige Weg ist der Wert in eine Variable zu kopieren. 'var date = Daten [0]; var a = db.Tabelle.Single (d => d.Datum == Datum); ' –

Verwandte Themen