При использовании EntityFramework я получаю ошибку " A lambda expression with a statement body cannot be converted to an expression tree
" при попытке скомпилировать следующий код:
Obj[] myArray = objects.Select(o =>
{
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2 };
}).ToArray();
Я не знаю, что означает ошибка, и больше всего, как ее исправить. Любая помощь?
c#
linq
entity-framework
linq-to-entities
pistacchio
источник
источник
Ответы:
Является ли
objects
контекст базы данных Linq-To-SQL? В этом случае вы можете использовать только простые выражения справа от оператора =>. Причина в том, что эти выражения не выполняются, а преобразуются в SQL для выполнения в базе данных. Попробуй этоисточник
Вы можете использовать тело оператора в выражении lamba для коллекций IEnumerable . Попробуй это:
Обратите внимание:
при использовании этого метода тщательно продумайте, потому что таким образом у вас будут все результаты запроса в памяти, которые могут иметь нежелательные побочные эффекты для остальной части вашего кода.
источник
AsEnumerable()
маски, моя проблема исчезнет!Это означает, что вы не можете использовать лямбда-выражения с «телом оператора» (т. Е. Лямбда-выражениями, в которых используются фигурные скобки) в тех местах, где лямбда-выражения необходимо преобразовать в дерево выражений (что, например, имеет место при использовании linq2sql) ,
источник
Не зная больше о том, что вы делаете (Linq2Objects, Linq2Entities, Linq2Sql?), Это должно заставить его работать:
источник
.AsEnumerable()
Используйте эту перегрузку select:
источник
Expression<Func<Obj,Obj>>
.Возвращаемый объект LINQ to SQL реализовывал
IQueryable
интерфейс. Поэтому дляSelect
параметра-предиката метода следует указывать только одно лямбда-выражение без тела.Это связано с тем, что LINQ для кода SQL не выполняется внутри программы, а не на удаленной стороне, такой как сервер SQL или другие. Этот тип выполнения отложенной загрузки был достигнут путем реализации IQueryable, где его ожидаемый делегат обернут в класс типа Expression, как показано ниже.
Дерево выражений не поддерживает лямбда-выражения с телом и его единственная поддержка лямбда-выражений, например
var id = cols.Select( col => col.id );
Поэтому, если вы попробуете следующий код не будет работать.
Следующее будет работать в соответствии с ожиданиями.
источник
Это означает, что лямбда-выражение типа,
TDelegate
которое содержит,([parameters]) => { some code };
не может быть преобразовано вExpression<TDelegate>
. Это правило.Упростите ваш запрос. Тот, который вы предоставили, может быть переписан как следующий и будет скомпилирован:
источник
Является
Arr
базовым типомObj
? Существует ли класс Obj? Ваш код будет работать, только если Arr является базовым типом Obj. Вы можете попробовать это вместо этого:источник
В вашем конкретном случае тело предназначено для создания переменной, и переключение на
IEnumerable
заставит все операции обрабатываться на стороне клиента. Я предлагаю следующее решение.Изменить: Переименовать для C # Coding Convention
источник