2013-03-18 13 views
5

projekt tylko przełączenie z LINQ-SQL do LINQ do podmiotów, a teraz pojawia się błądTyp węzła wyrażeń LINQ "ArrayIndex" nie jest obsługiwany w LINQ do jednostek. ale jest obsługiwany przez LINQ-SQL

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

dla tej linii:

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

(Fixing to w tym konkretnym przypadku jest to łatwe, jak w

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

)

Ale dlaczego działa to w linq-sql, ale nie w linq-to-entity? Czy sprawili, że linq-to-entity jest gorsze niż linq-sql? Czego mi brakuje?

+2

LINQ to SQL i LINQ to Jednostki są opracowywane całkowicie oddzielnie, nie ma tu odpowiedniego kodu wspólnego. Wymaga to dodatkowego wsparcia w LINQ dla SQL dla czegoś, co na pierwszy rzut oka nie ma sensu (wygląda na to, że próbujesz przekazać 'date' jako parametr tablicy i serwer odczytuje pierwszy element), więc ja ' Zgaduję, że nie jest to bardzo często używane i z tego powodu po prostu nigdy nie było brane pod uwagę w LINQ do Entities. Jak się domyślam, powstrzymam się od opublikowania go jako odpowiedzi. – hvd

+0

Wygląda mi na błąd. Drzewo wyrażenia powinno najpierw zostać przetworzone do najprostszych wyrażeń przed przetłumaczeniem na język SQL. Jest to w zasadzie to, co robi @dontomaso poprzez wstępną ocenę dat [0], ale nie powinno to robić ręcznie (szczególnie w przypadku takiego prostego wyrażenia). – Ackroydd

Odpowiedz

2

To dlatego, że L2E po prostu próbuje przetłumaczyć zapytanie na polecenie sql. Tak więc wszelkie dodatkowe rzeczy (metody takie jak .ToString() i inne rzeczy, których nie można przetłumaczyć na SQL) prowadzą do tego wyjątku.

Jednak L2S jak linq do obiektów implementuje IEnumerable. Tak więc ich cel jest inny: L2E do tłumaczenia zapytań linq do poleceń sql, L2O do pracy z obiektami IEnumerable in-memory oraz L2S do modelowania i pracy z bazą danych.

Teraz, jeśli chcemy, aby móc korzystać z L2S zapytań w projekcie EF (z użyciem L2e), należy najpierw przekonwertować dane pobierane z wami DbContext do IEnumerable:

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

Przenosi wszystkie dane z bazy danych do pamięci, nie jest to ideą. Właściwym sposobem jest kopiowanie wartości do zmiennej. 'var date = dates [0]; var a = db.Table.Single (d => d.Date == date); ' –

Powiązane problemy