2009-06-13 7 views
1

고객 유형 엔터티에 대한 참조가있는 엔터티 유형 Order가 있습니다. 조건에 따라 Order 목록을 반환하는 함수 가져 오기가 있습니다. 표시되는 Datagrid에 표시되는 주문 목록이EntityReference.Load()를 사용하지 않고 수동으로 EntityReference를로드하는 방법

Order.Date | Order.Customer.Name | Order. Total

Customer.Name이 표시되도록하려면 목록의 각 Order에 CustomerReference를로드해야하지만 Order.CustomerReference.Load()를 호출 할 때마다 SQL Server를 왕복하고 전체 과정은 매우 비효율적이다. 질문 : 목록의 모든 주문에 대한 모든 고객 데이터를 검색하는 단일 쿼리가있는 경우 각 주문의 CustomerReference를 수동으로 채우는 방법은 무엇입니까?

기본적으로 필자는 함수 가져 오기와 함께 .Include ("Customer")를 수행해야합니다.

감사

답변

2

당신이 한 번에 모든 관련 고객을 다시 가져 오는 쿼리를 실행하면, 수동으로 각 CustomerReference를 채울 필요가 없습니다. Relationship Fixup이라고하는 무언가가 자동으로 수행하기 때문입니다.

즉 당신이 할 경우 :

Order o = ctx.Orders.First(o => o.Customer.ID == 1); 
// at this point o.Customer == null 

Customer c = ctx.Customers.First(c => c.ID == 1); 
// at this point o.Customer == c 

관계 오류 복구의 의미를 그 고객은 모든 관련 개체가 지금에 자동으로 가리 킵니다 상황 ...

즉 전환 된 후, 이것은 생각보다 훨씬 쉽습니다!

희망이

-1

감사 알렉스

알렉스, 나는 그것을 시도 할 수 있습니다. 그것은 당신이 말한대로 작동하지만 외관상 파생 된 엔티티 유형에서는 작동하지 않습니다. Order Entity Type은 파생 클래스 Sale을 가진 추상 기본 클래스입니다.

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2); 
//At this point o.Customer == c but s1.Customer is still null 

추상이고 반환 유형으로 사용할 수 없기 때문에 함수 가져 오기 유형을 Order로 설정할 수 없습니다.

무엇이 여기에 있습니까?

업데이트 : 및 고객이 를로드하기 전에 S1 o1.CustomerReference.IsLoaded이 False o1.CustomerReference.EntityKey는 ID가 = 2

s1.CustomerReference.IsLoaded이 내가 발견 O1 차이가있을 것입니다 False s1.CustomerReference.EntityKey가 null입니다.

그러나 s1.CustomerReference.Load()를 호출하면 고객 데이터가 올바르게로드됩니다. 내 GetSaleByCustomerID 함수 가져 오기 (간단히 "SELECT * WHERE ID = 2")를 두 번 확인하면 참조에 필요한 CustomerID 필드가 반환됩니다.

관련 문제