2017-04-27 5 views
1

I는 Customer 많은 SalesOrders을 내 시나리오에서는 엔티티 프레임 워크 v6.1.3마술 문자열을 사용하지 않고 Entity Framework의 많은 : 하나의 탐색 속성을로드하려면 어떻게해야합니까?

를 사용 열망 로딩 실체가있는 경우 복잡한 탐색 속성을 지정하는 방법을 찾고 있어요하고 SalesOrder 정확히 하나의 DeliveryAddress

관련이있다 엔티티 코드 조각은 다음과 같습니다

public class Customer {  
    public virtual ICollection<SalesOrder> SalesOrders { get; set; } 
} 

public class SalesOrder { 
    public Customer Customer { get;set; } 
    public Address DeliveryAddress { get; set; } 
} 

public class Address { 
    public virtual ICollection<SalesOrder> SalesOrders { get; set; } 
} 

내가 지금 그 주문 그들의 모든 주문 및 배달 주소를 포함하여, 고객을 열망 -로드하는 방법을 구현해야합니다.

나는이 작업을 수행 할 수 있습니다

public class MyDbContext : DbContext { 

    public virtual DbSet<Customer> Customers { get; set; } 

    public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
    var customer = Customers 
     .Include("SalesOrders") 
     .Include("SalesOrders.DeliveryAddress") 
     .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
    } 

}

하지만 모델의 비트를 이름 바꾸기와 두통 모든 종류의 원인이되는 마법 문자열을 사용하여로드 할 탐색 속성을 지정할 필요.

EF는 표현식을 사용하여 탐색 속성을 지정할 수도 있지만이 같은 표현을 사용하여 Customer> SalesOrder> DeliveryAddress 연결을 지정하는 방법을 알지 못합니다. 가능한가? 이반 Stoev 자신의 의견에서 지적 하듯이

public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
    var customer = Customers. 
    .Include(c => c.SalesOrders) 

    .Include(c => /* WHAT DO I PUT HERE? */) 

    .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
} 
+1

한 가지 방법은. – Mats391

+1

VS에서'Include'의 람다 오버로드에 마우스를 가져 가면, 당신을 포함하여 다양한 시나리오에서 어떻게 사용 하는지를 설명하는 전체 도움말 항목을 볼 수 있습니다. 기본적으로 내부에서 '선택'을 사용해야합니다. 'Include (c => c.SalesOrder.Select (so => ​​so.DeliveryAddress)) ' –

+0

@IvanStoev 그것은 절대적으로 완벽합니다. 동의 할 수 있도록 답변으로 게시 하시겠습니까? 고맙습니다. –

답변

1

, 내가 여기에 필요한 구문은 다음과 같습니다 nameof``사용하는 것이 더 좋은 약간 될 문자열 변형을 할

public Customer LoadCustomerIncludingSalesOrders(int customerId) { 
var customer = Customers. 
    .Include(c => c.SalesOrders) 
    .Include(c => c.SalesOrders.Select(so => so.DeliveryAddress)) 
    .FirstOrDefault(c => c.Id == customerId); 
    return customer; 
}