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();
오류가 무엇을 의미하는지, 무엇보다도 오류를 해결하는 방법을 모르겠습니다. 어떤 도움?
답변
가 objects
Linq에 – 투 – SQL 데이터베이스 컨텍스트는? 이 경우 => 연산자 오른쪽에 간단한 표현식 만 사용할 수 있습니다. 그 이유는 이러한 표현식이 실행되지 않지만 데이터베이스에 대해 실행되도록 SQL로 변환되기 때문입니다. 이 시도
Arr[] myArray = objects.Select(o => new Obj() {
Var1 = o.someVar,
Var2 = o.var2
}).ToArray();
답변
IEnumerable 콜렉션에 대해 람바 표현식에서 명령문 본문을 사용할 수 있습니다 . 이거 한번 해봐:
Obj[] myArray = objects.AsEnumerable().Select(o =>
{
var someLocalVar = o.someVar;
return new Obj()
{
Var1 = someLocalVar,
Var2 = o.var2
};
}).ToArray();
주의 사항 : 이 방법을 사용할 때는 신중하게 생각하십시오 . 이 방법을 사용하면 모든 쿼리 결과가 메모리에 저장되며 나머지 코드에는 원하지 않는 부작용이 발생할 수 있습니다.
답변
즉, 람다 식을 표현식 트리로 변환해야하는 위치 (예 : linq2sql을 사용하는 경우)에서 “statement body”(예 : 중괄호를 사용하는 람다 식)와 함께 람다 식을 사용할 수 없습니다. .
답변
수행중인 작업 (Linq2Objects, Linq2Entities, Linq2Sql?)에 대해 더 많이 알지 못하면 작동해야합니다.
Arr[] myArray = objects.AsEnumerable().Select(o => {
var someLocalVar = o.someVar;
return new Obj() {
Var1 = someLocalVar,
Var2 = o.var2
};
}).ToArray();
답변
이 선택 과부하를 사용하십시오.
Obj[] myArray = objects.Select(new Func<Obj,Obj>( o =>
{
var someLocalVar = o.someVar;
return new Obj()
{
Var1 = someLocalVar,
Var2 = o.var2
};
})).ToArray();
답변
LINQ to SQL 리턴 오브젝트가 IQueryable
인터페이스 를 구현하고있었습니다 . 따라서 Select
메소드 술어 매개 변수의 경우 본문없이 단일 람다 표현식 만 제공해야합니다.
LINQ for SQL 코드는 SQL Server 또는 다른 서버와 같은 원격 쪽이 아니라 프로그램 내부에서 실행되지 않기 때문입니다. 이 지연로드 실행 유형은 예상 대리자가 아래와 같이 Expression 유형 클래스에 래핑되는 IQueryable을 구현하여 달성되었습니다.
Expression<Func<TParam,TResult>>
표현식 트리는 본문이있는 람다 식을 지원하지 않으며 단일 행 람다 식만 지원합니다. var id = cols.Select( col => col.id );
따라서 다음 코드를 시도하면 작동하지 않습니다.
Expression<Func<int,int>> function = x => {
return x * 2;
}
다음은 예상대로 작동합니다.
Expression<Func<int,int>> function = x => x * 2;
답변
이는를 TDelegate
포함하는 유형의 Lambda 표현식을 ([parameters]) => { some code };
로 변환 할 수 없음을 의미합니다 Expression<TDelegate>
. 규칙입니다.
쿼리를 단순화하십시오. 제공 한 것은 다음과 같이 다시 작성 될 수 있으며 컴파일됩니다.
Arr[] myArray = objects.Select(o => new Obj()
{
Var1 = o.someVar,
Var2 = o.var2
} ).ToArray();