Ao usar o EntityFramework , recebo o erro " A lambda expression with a statement body cannot be converted to an expression tree
" ao tentar compilar o seguinte código:
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2 };
}).ToArray();
Não sei o que significa o erro e, acima de tudo, como corrigi-lo. Qualquer ajuda?
c#
linq
entity-framework
linq-to-entities
pistacchio
fonte
fonte
Respostas:
É
objects
um contexto de banco de dados Linq-To-SQL? Nesse caso, você pode usar apenas expressões simples à direita do operador =>. O motivo é que essas expressões não são executadas, mas são convertidas em SQL para serem executadas no banco de dados. Tente istofonte
Você pode usar o corpo da instrução na expressão lamba para coleções IEnumerable . tente este:
Aviso:
pense com cuidado ao usar esse método, pois dessa forma, você terá todos os resultados da consulta na memória, que podem ter efeitos colaterais indesejados no restante do seu código.
fonte
AsEnumerable()
máscaras meu problema vai embora!Isso significa que você não pode usar expressões lambda com um "corpo de instrução" (ou seja, expressões lambda que usam chaves) em locais onde a expressão lambda precisa ser convertida em uma árvore de expressão (que é o caso ao usar linq2sql) .
fonte
Sem saber mais sobre o que você está fazendo (Linq2Objects, Linq2Entities, Linq2Sql?), Isso deve fazer com que funcione:
fonte
.AsEnumerable()
Use esta sobrecarga de seleção:
fonte
Expression<Func<Obj,Obj>>
.O objeto de retorno LINQ to SQL estava implementando a
IQueryable
interface. Portanto, para oSelect
parâmetro predicado do método, você deve fornecer apenas uma expressão lambda sem corpo.Isso ocorre porque o código LINQ for SQL não é executado dentro do programa e não no lado remoto, como o SQL Server ou outros. Esse tipo de execução de carregamento lento foi conseguido implementando IQueryable onde seu representante esperado está sendo agrupado na classe Tipo de expressão, como abaixo.
A árvore de expressão não suporta expressão lambda com body e seu único suporte a expressão lambda de linha única como
var id = cols.Select( col => col.id );
Portanto, se você tentar o seguinte código não funcionará.
O seguinte funcionará conforme o esperado.
fonte
Isso significa que uma expressão Lambda do tipo
TDelegate
que contém a([parameters]) => { some code };
não pode ser convertida em umExpression<TDelegate>
. É a regra.Simplifique sua consulta. O que você forneceu pode ser reescrito da seguinte maneira e será compilado:
fonte
É
Arr
um tipo de baseObj
? A classe Obj existe? Seu código funcionaria apenas se Arr fosse um tipo base de Obj. Você pode tentar isso:fonte
Para o seu caso específico, o corpo é para criar uma variável e, alternando para
IEnumerable
forçará todas as operações a serem processadas no lado do cliente, proponho a seguinte solução.Editar: Renomear para Convenção de Codificação C #
fonte