2011-10-24 2 views
1

나는 다음과 같은 간단한 시나리오를 가지고있다. 내 edmx에 정의 된 Customer 클래스가 있습니다. Order 클래스도 있으며 고객은 Orders 속성을 통해 0 개 이상의 Orders를 가질 수 있습니다.EF 사용자 정의 셀렉터 식

public partial class Customer 
{ 
    public int OrderCount { get; set; } 
} 

내가 쉽게 적절하게이 ordercount가의 값을로드 선택 쿼리를 작성하고 싶습니다 :

는이 같은 내 Customer 클래스에 ordercount가 속성을 정의했다. 나는 고객 클래스에서이 일을 시도 : 다음

public partial class Customer 
{ 
    public int OrderCount { get; set; } 

    public static Expression<Func<Customer, Customer>> DetailSelector = c => 
     { 
      c.OrderCount = c.Orders.Count; 
      return c; 
     }; 
} 

그리고 선택 쿼리 그러나

var customersWithOrderCount = ctx.Customers.Select(Customer.DetailSelector); 

, 나는 오류가이 방법을 성명 본체와 람다가로 변환 할 수없는 표현식. 은 그 때 나는이 작업을 수행하려고 :

public partial class Customer 
{ 
    public int OrderCount { get; set; } 

    public static Expression<Func<Customer, Customer>> DetailSelector = c => Customer.LoadDetail(c); 

    public static Customer LoadDetail(Customer customer) 
    { 
     customer.OrderCount = customer.Orders.Count; 

     return customer; 
    } 
} 

그러나 나는 다음과 같은 예외가 얻을 선택 쿼리 실행이 방법 :

LINQ to Entities does not recognize the method 'Customer LoadDetail(Customer)' method, and this method cannot be translated into a store expression. 

어떻게이 작업을 수행하는 가장 쉬운 방법이 될 것입니까?

UPDATE : 그냥 설명을 위해, 내가 특별히 식을 할 수있는 방법을 찾고 있어요. 따라서 데이터베이스에서 Orders를로드하지 않으려면 OrderCount 속성을 채우고 싶습니다. 감사합니다,

답변

0

이 조금 단순한,하지만 난 엔티티의 기본 작업 디자인 숙박을 생각합니다. IMHO가 사용하는 가장 좋은 방법입니다. 주문. 계산. 당신이 거기에서 그것을 당기고 있다면, 그것을 거기에 보관하지 않겠습니까?

당신이 선택 쿼리를 작성하려면

직접 Customers.Orders에서 값을 포함하고 적절한 SQL 당신을 위해 생성됩니다. 그렇지 않으면 고객로드 후 바로이 값을 CustomerRepository 클래스에 포함되도록 개인적으로 포함합니다. 그런 다음 당신은 항상 한 곳에서 고객을 얻을 당신은 그것의 집합을 알고

+0

예 (물론 저장소 패턴의 사용을 의미한다) 그러나 나는 WCF와 분산 시나리오에서 고객 인스턴스를 사용하고, 나는로드하지 않고 Orders를 클라이언트에게 보내고, 그 수만 계산하십시오. (그리고 이것은 실제 응용 프로그램에서 이처럼 많은 다른 속성이있는 단순한 예입니다.) –