2011-12-05 2 views
1

결과가 여전히 구성 가능하도록 LinqToSql (또는 EF) 쿼리에서 여러 엔터티를 반환 할 수 있습니까 (쿼리가 메서드 내에 있음)? 이 같은LinqToSQL (또는 EF)에서 여러 엔터티 반환

뭔가 :

public IQueryable<KeyValuePair<Customer, Product>> GetCustomerEntities() 
{ 
    return 
    (
     from customer in this.Context.Customers 
       join 
       product in this.Context.Products on customer.ID equals product.CustomerID  
     select new KeyValuePair<Customer, Product>(customer, product) 
    ); 
} 

가 그럼 난 더 같은 쿼리를 작성하는 데이 방법의 결과를 사용하려면 :

this.GetCustomerEntities().Where(e => e.Key.Name == "my customer") 

컴파일 위의 방법 만이 실행할 수 없습니다 LinqToSql에 의해 KeyValuePair을 SQL로 변환 할 수 없으므로 예상되는 동작입니다.

어떻게 든이를 달성 할 수 있습니까?

답변

1

여기서 문제는 생성자 매개 변수로 customer을 전달하는 것이 e.Key을 보는 것과 같은 일임을 런타임에서 볼 수 없다는 것입니다. 두 가지가 분명히 동일하지 않기 때문입니다. 당신은 즉

select new CustomerProduct { Customer = customer, Product = product } 

getter 및 setter와 자신의 POCO 유형을 생성하고 그 대신 KeyValuePair<Customer,Product>을 사용하려고 할 수도 있습니다.

단일 메서드 내에서 익명 형식이 확실한 선택입니다.

+0

감사합니다. 작동합니다! 먼저 SQL을 실행하지 않고 쿼리를 작성할 수 있습니다. – SzilardD

0
this.GetCustomerEntities().ToList().Where(e => e.Key.Name == "my customer") 

그래야합니다. 가능한 가장 효율적인 것은 아니지만 적어도 실행은 가능할 것입니다. ToList()를 사용하여 열거하면 쿼리가 SQL 서버에서 실행되고 이후 작업은 메모리의 열거에 수행됩니다. 따라서 KeyValuePair 클래스를 자유롭게 사용할 수 있습니다.

특히 SQL을 활용하기 위해 쿼리를 구체적으로 작성하려면 함수를 매개 변수화하고 처음부터 데이터베이스에서 원하는 행만 가져와야합니다.

관련 문제