“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 ()"메소드가 있습니다.
'Program Tip' 카테고리의 다른 글
벡터 드로어 블을 미리 볼 수있는 방법이 있습니까? (0) | 2020.11.26 |
---|---|
멤버 식의 값에 액세스 (0) | 2020.11.26 |
codeigniter에서 base_url () 함수가 작동하지 않습니다. (0) | 2020.11.26 |
CSV 파일에 대해 쉼표와 큰 따옴표를 동시에 이스케이프하는 방법은 무엇입니까? (0) | 2020.11.26 |
SharedPreferences를 사용하여 문자열 세트를 저장하려고 할 때의 오작동 (0) | 2020.11.26 |