Program Tip

“LINQ 식 노드 유형 'Invoke'는 LINQ to Entities에서 지원되지 않습니다.”-당황했습니다!

programtip 2020. 11. 26. 19:45
반응형

“LINQ 식 노드 유형 'Invoke'는 LINQ to Entities에서 지원되지 않습니다.”-당황했습니다!


나중에 EF에서 Linq 쿼리의 일부로 사용할 익명 함수를 전달하려고합니다. 이 함수는 INT를 전달하고 BOOL을 반환합니다 (u.RelationTypeId는 INT입니다). 아래는 내 기능의 단순화 된 버전입니다.

public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation)
{
    using (var ctx = new OpenGroovesEntities())
    {
        Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId);

        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}

그러나 위에서 언급 한 오류가 발생합니다. 함수에서 술어를 작성하여 모든 것을 올바르게 수행하는 것 같습니다. 어떤 아이디어? 감사.


임의의 .NET 함수를 전달하려고합니다 ... 엔티티 프레임 워크가이를 SQL로 변환하는 방법은 무엇입니까? 다른 매개 변수 표현식으로 표현식을 다시 작성해야하기 때문에 (즉, 원래 표현식에있는 매개 변수 표현식을 대체해야하기 때문에) 그다지 쉽지 는 않지만 Expression<Func<int, bool>>대신 an을 사용 하도록 변경하고 Where그로부터 절 을 작성할 수 있습니다. 호출의 표현으로 트리 ).u.RelationTypeId

솔직히 말해서 u.RelationTypeId메서드에 전달할 식 트리를 만드는 데 사용하는 람다 식을 지정하기 위해 다음을 사용하는 것이 좋습니다.

public IEnumerable<UserBandRelation> GetBandRelationsByUser(
    Expression<Func<UsersBand, bool>> predicate)
{
    using (var ctx = new OpenGroovesEntities())
    {
        var relations = ctx.UsersBands.Where(predicate);

        // mapping, other stuff, back to business layer
        return relations.ToList();
    }
}

이 오류가 발생 하여 Joe Albahari의 PredicateBuilder 와 함께 Entity Framework를 사용하여 동적 where절을 작성하고 있습니다. 동일한 상태에 있으면 AsExpandable메서드를 호출해야합니다 .

Entity Framework로 쿼리하는 경우 마지막 줄을 다음과 같이 변경합니다.

return objectContext.Products.AsExpandable().Where(predicate);

이 방법을 사용하면 잡을 수 LINQKIT의 DLL의 일부입니다 여기 또는 NuGet 패키지를 통해 여기 .

이제 모든 것이 잘 작동합니다. :)


where 요청 전에 조건 자 에서 Expand () 메서드를 호출 할 수 있습니다.


이 답변이 정말 늦었다는 것을 알고 있지만 같은 문제가 발생하여 여기로 이어 져서 해결책을 공유 할 것이라고 생각했습니다.

나는 Leniel의 대답을 읽었고 그것은 나에게 아이디어를 주었다. 기본 유형에는 동일한 방식으로 작동하여 문제를 완화하는 "AsEnumerable ()"메소드가 있습니다.

참고 URL : https://stackoverflow.com/questions/5284912/the-linq-expression-node-type-invoke-is-not-supported-in-linq-to-entities

반응형