2013-03-18 10 views
5

Un progetto appena passato da LINQ to SQL per LINQ to entità, e ora ottengo l'erroreIl nodo di espressione LINQ di tipo "ArrayIndex" non è supportato in LINQ alle entità. ma è supportato da LINQ to SQL

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

per questa linea:

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

(fissaggio in questo caso particolare è facile, come in

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

)

Ma perché funziona in linq-to-sql ma non in linq-to-entity? Hanno fatto linq-to-entity peggio di linq-to-sql? Cosa mi manca?

+2

LINQ to SQL e LINQ to Le entità sono sviluppate completamente separatamente, qui non esiste un codice condiviso pertinente. Richiede supporto aggiuntivo in LINQ to SQL per qualcosa che a prima vista non ha senso (sembra che tu stia cercando di passare 'dates' come parametro dell'array, e che il server legga il primo elemento), quindi io ' Immagino che non sia molto usato e per questo motivo non è mai stato considerato per LINQ alle Entità. Dato che questa è una supposizione, mi asterrò dal postarla come risposta. – hvd

+0

Sembra un bug per me. Prima di tradurre in SQL, l'albero delle espressioni deve essere risolto con espressioni più semplici. Questo è essenzialmente ciò che @dontomaso sta facendo valutando le date [0], ma non dovrebbe farlo manualmente (specialmente per un'espressione così semplice). – Ackroydd

risposta

2

Questo perché L2E tenta semplicemente di tradurre la query in un comando sql. Quindi, qualsiasi altra cosa (metodi come .ToString() e altre cose che non possono essere tradotte in SQL) porta a quell'eccezione.

Tuttavia, L2S come linq agli oggetti implementa IEnumerable. Quindi, l'obiettivo di loro è diverso: L2E per tradurre query linq in comandi sql, L2O per lavorare con oggetti IEnumerable in-memory e L2S per modellare e lavorare con un database.

Ora, se vogliono essere in grado di utilizzare i vostri L2S query nel progetto EF (utilizzando L2E), si deve prima convertire i dati recuperati da voi DbContext a IEnumerable:

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

Non è un'idea portare tutti i dati dal database alla memoria. Il modo corretto è copiare il valore su una variabile. 'var date = dates [0]; var a = db.Table.Single (d => d.Date == date); ' –

Problemi correlati