[C#] “문 본문이있는 람다 식은 식 트리로 변환 할 수 없습니다”

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();

오류가 무엇을 의미하는지, 무엇보다도 오류를 해결하는 방법을 모르겠습니다. 어떤 도움?



답변

objectsLinq에 – 투 – 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();