/ / O tipo de nó de expressão LINQ 'ArrayIndex' não é suportado no LINQ to Entities. mas é suportado pelo linq-to-sql - entidade-estrutura, linq-to-sql, linq-para-entidades

O tipo de nó de expressão LINQ 'ArrayIndex' não é suportado no LINQ to Entities. mas é suportado pelo linq-to-sql - entidade-estrutura, linq-to-sql, linq-para-entidades

Um projeto apenas mudou de linq para sql para linq para entidades, e agora recebo o erro

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

para esta linha:

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

(Corrigir neste caso em particular é fácil, como em

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

)

Mas por que isso funciona no linq-to-sql, mas não no linq-to-entities? Eles fizeram o linq-to-entities pior que o linq-to-sql? o que estou perdendo?

Respostas:

3 para resposta № 1

Isso é porque o L2E apenas tenta traduzir sua consulta para um comando sql. Portanto, quaisquer coisas adicionais (métodos como .ToString () e outras coisas que não podem ser traduzidas para SQL) levam a essa exceção.

No entanto, L2S como linq para objetos implementaIEnumerable. Assim, o objetivo deles é diferente: L2E para traduzir consultas do linq para comandos sql, L2O para trabalhar com objetos IEnumerable na memória e L2S para modelar e trabalhar com um banco de dados.

Agora, se você quiser usar suas consultas L2S em seu projeto EF (usando L2E), primeiro converta seus dados recuperados de seu DbContext para IEnumerable:

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