2011-04-13 2 views
0

저는 LINQ에 조금 어려움을 겪어 왔고 도움을 받았습니다. SQL로 할 수는 있지만 LINQ에서 작업하는 방법을 생각할 수는 없습니다. C#에서 Entity Framework 4.0 EDMX로 모델링 한 SQL Compact 4.0 데이터베이스가 있습니다. 많은 참여에 단지 많은을 촉진 주문many-to-many에 걸친 LINQ 구문

OrderDetails의 테이블이 아닌 페이로드 테이블, - OrderDetails의 -
고객 :

는 시나리오,이 테이블입니다.

CustomerId Number를 매개 변수로 지정하면 IEnumerable<Orders>을 반환하려고합니다.

SELECT  Orders.* 
FROM   OrderDetails INNER JOIN 
        Orders ON OrderDetails.OrderId = Orders.OrderId INNER JOIN 
        Customers ON OrderDetails.CustomerId = Customers.CustomerId 

가 어떻게 LINQ에서이 작업을 수행 할 수 있습니다

는 SQL에서 나는이 같은 작성한 것? 이 같은

+0

모델에 포함 된 엔티티의 수는 무엇입니까 ?? – AlaaL

+0

방금 ​​테이블을 대체 할 때 '익명 성을 유지하기 위해'노스 윈드 (Northwind)에 상응하는 테이블을 사용하는 것을 혼란스럽게 생각했습니다. 직면하게되면 주문에 고객이 얼마나 자주 있을까요? 죄송합니다. 그러나 본질적으로 비 페이로드 중간 테이블은 EDMX의 디스플레이에 숨겨져 있습니다. –

+0

이게 작동할까요? db.Orders.FirstOrDefault (o => o.OrderId == id) .Customers;를 반환하십시오. –

답변

2

, 당신은이 같은 쿼리 식으로이 작업을 수행 할 수 있습니다 Customers 테이블을 모두 터치하십시오 ... OrderDetails.CustomerId이 실제로 실제 고객을 참조하는지 확인하기위한 충분한 관계형 제약 조건이 있다고 가정합니다.

그러나 모든 관계가 적절하게 설정된 경우 Sjoerd의 대답과 같은 것을 사용할 수 있습니다. 위의 쿼리는 그렇지 않지만 먼저 Customer 엔터티를 가져옵니다. 그것은 사고에 대한 좀 더 많은 생각입니다.

편집 : 그것은가 나타납니다 당신의 관계가 설정되어 적절하게 두 가지 옵션 :이 일할 수있는 생각

// This will involve checking the customer data first 
var customer = db.Customers.SingleOrDefault(c => c.CustomerId == customerId); 
if (customer != null) 
{ 
    var orders = customer.Orders; 
} 

// This shouldn't... hopefully :) You'll end up with an empty sequence if 
// the customer doesn't exist 
var orders = db.Customers.Where(c => c.CustomerId == customerId) 
         .SelectMany(c => c.Orders); 
+0

SQL에 익숙하다는 점을 감안할 때이 점에 대해 높이 평가합니다. 그러나 언급 한 바와 같이, 모든 관계가 모델에 올바르게 설정되어 있음을 가장 잘 알고 있습니다. –

+0

@DavidC : 관계를 사용하는 것이 좋습니다. 편집 할 것입니다. –

+0

환상적입니다! 도움 주셔서 감사합니다 존. –

0

뭔가 :이 실제로하지 않는

int customerId = ...; 
var query = from detail in OrderDetails 
      where detail.CustomerId == customerId 
      join order in Orders on detail.OrderId equals order.OrderId 
      select order; 

참고 : "SQL 생각"하려면

Customer customer = DataContext.Customers.Single(c => c.Id == CustomerId); 
IEnumberable<Order> orders = customer.OrderDetails.Orders; 
+0

OrderDetails 엔티티가 없습니다. 많은 관계에서 엔티티로 표현되지 않은 중간 테이블 – AlaaL

0

:

int customerId = ...; 
var query = Customers.Include("Orders").Where(cust => cust.CustomerID == customerId) 
0

당신은 적어도 하나 명의 고객이 모든 주문을하려는 경우 ID customerId 당신은 또한이 시도 할 수 :

var orders = context.Orders 
    .Where(o => o.Customers.Any(c => c.CustomerId == customerId)).ToList(); 

그것은 다소 본다 나에게 이상한 것은 한 주문에 많은 고객이있을 수 있지만 고객의 주문 설명을 이해하는 방법입니다. "Customers - OrderDetails - Orders ... OrderDetails 테이블은 페이로드가 아닌 테이블이며 많은 수의 조인을 용이하게합니다."

EntityModel의 Order에 내비게이션 모음이 Customers이고 OrderDetails이 엔티티로 존재하지 않는 내부 조인 테이블 일 것으로 예상됩니다.

관련 문제