2010-12-10 4 views
1

LinQ 문에서 Entity Object를 만들고 싶지만 모든 열을로드하지 않으려합니다.Entity Framework - LinQ 프로젝션 문제

내 ORDERS 개체에 많은 열이 있지만 SQL 문과 결과가 더 작아 지도록 REFERENCE 및 OPERATION 열을 검색하려고합니다.

이 LINQ 문이 제대로 작동로드 내 모든 객체 속성 : 발생 된 오류가

var orders = (from order in context.ORDERS 
       select new ORDERS 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION 
       }); 

입니다

다음 문이 실패 그러나

var orders = (from order in context.ORDERS 
      select order); 

내 개체의 두 가지 속성을로드 :

The entity or complex type 'ModelContextName.ORDERS' cannot be constructed in a LINQ to Entities query.

무엇이 문제인가? 이 방법으로 객체를 부분적으로로드 할 수 있습니까?

미리 답변 해 주셔서 감사합니다.


답변

내가 가지고 지금은 답을 모두 사용하기 때문에 당신 Yakimych 딘 모두 감사해야하고 확인 :

var orders = (from order in context.ORDERS 
       select new 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION, 
       }) 
       .AsEnumerable() 
       .Select(o => 
         (ORDERS)new ORDERS 
         { 
          REFERENCE = o.REFERENCE, 
          OPERATION = o.OPERATION 
         } 
     ).ToList().AsQueryable(); 

그리고 내가의를 원하는 것을 정확하게 얻을 SQL 문은 완벽하지는 않지만 필자가 필요로하는 2 개의 열 (그리고 모든 행 "1"을 포함하는 다른 열을 반환하지만 그 이유는 모르겠습니다.) - 이 메서드로 하위 개체를 만들려고했는데 잘 작동한다.

답변

2

아니요, 매핑 된 개체에 투영 할 수 없습니다. 나는 문제가 쿼리 자체 내에서 새로운 개체를 만드는 생각, 어떻게 노력에 대해이

var orders = (from order in context.ORDERS 
       select new 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION 
       }); 
+0

좋아, 이미이 방법을 시도했지만 어떻게이 익명 개체를 내 엔터티 형식으로 캐스팅 할 수 있습니까? – mbp

+2

이것을 엔티티에 맵핑 할 수 없습니다.이것을 위해 사용자 지정 개체 (DTO)를 만들 수는 있지만 엔티티를 부분적으로로드 할 수는 없습니다. EF는 변경 및 안전을 시도 할 때 EF가이 작업을 처리하지 못하기 때문입니다. – Steven

0

:

context.ORDERS.ToList().Select(o => new ORDERS 
{ 
    REFERENCE = o.REFERENCE, 
    OPERATION = o.OPERATION 
}); 
+0

SQL 쿼리의 문제는 해결되지 않습니다. 전체 개체를 가져오고 모든 필드에서 데이터를 가져 오는 경우와 동일합니다. 실행 된 후에 결과를 메모리로 변환합니다. 그러나, 나중에 그 일을 할 아무런 의미가 없습니다. – Yakimych

+0

소스 코드를 게시 할 수 없어서 첫 번째 게시물을 확인하십시오. – mbp

2

위의 솔루션의 문제부터 것입니다 대신 익명의 유형을 사용할 수 있습니다 AsEnumerable()을 호출하면 쿼리가 데이터베이스에서 실행됩니다. 대부분의 경우, 괜찮을 것입니다. 그러나 큰 데이터베이스로 작업하는 경우 전체 테이블 (또는 뷰)을 가져 오는 것이 아마도 원하는 것이 아닙니다. 우리는 AsEnumerable을 제거한다면, 우리는 다음과 같은 오류와 함께 다시 원점으로 1이다 : 나는 여기에 하루 종일이 문제를 고민하고있다

The entity or complex type 'ModelContextName.ORDERS' cannot be constructed in a LINQ to Entities query.

내가 찾은 것입니다. 내 엔티티 클래스에서 상속받은 빈 클래스를 만들고이 클래스를 사용하여 프로젝션을 수행했습니다. (공분산 기능을 사용하여)

public sealed class ProjectedORDERS : ORDERS {} 

투사 된 쿼리

IQueryable<ORDERS> orders = (from order in context.ORDERS 
       select new ProjectedORDERS 
       { 
        REFERENCE = order.REFERENCE, 
        OPERATION = order.OPERATION, 
       }); 

자보세요! 이제 엔티티에 매핑되고 원하는 때에 만 실행될 예상 쿼리가 생깁니다.

+0

+1 나는이 이슈에 많은 시간을 할애했으며, 실패한 시도가 천 번 실패한 후에도 당신과 같은 해결책을 찾았습니다. 엔티티를 상속 한 빈 클래스. 아직도, 나는 EF가 엔티티 클래스에 투영하는 것을 허용하지 않는 이유를 알고 싶다. 이것은 많은 상황에서 믿을 수 없을만큼 유용 할 것이다. –