2009-07-07 2 views
5

Linq의 왼쪽 조인에 관해서는 이미 많은 질문이 있습니다. 그리고 내가 바라본 것들은 원하는 끝을 얻기 위해 join 키워드를 사용합니다.Linq에서 왼쪽 join?

이것은 나에게 의미가 없습니다. 테이블 CustomerInvoiceCustomerID의 외래 키로 연결되어 있고 Invoice에 있다고 가정 해 봅시다. 이제 고객 정보와 모든 인보이스가 포함 된 보고서를 실행하고 싶습니다. SQL은 다음과 같습니다 나는 SO에 대한 답변의 본 적이 어떤 사람들이 주로 제안하는

select c.*, i.* 
    from Customer c 
    left join Invoice i on c.ID = i.CustomerID 

에서 :

var q = from c in Customers 
     join i in Invoices.DefaultIfEmpty() on c.ID equals i.CustomerID 
     select new { c, i }; 

난 정말이 유일한 방법이 될 수있는 방법을 이해하지 않습니다. CustomerInvoice 사이의 관계는 이미 LinqToSQL 클래스에 의해 정의됩니다. join 절에 대해 왜 반복해야합니까? 내부 결합을 원한다면 간단하게 :

var q = from c in Customers 
     from i in c.Invoices 
     select new { c, i }; 

조인 된 필드를 지정하지 않아도됩니다!

var q = from c in Customers 
     from i in c.Invoices.DefaultIfEmpty() 
     select new { c, i }; 

을하지만 내부 조인 것처럼 그것은 단지 나에게 같은 결과를 주었다

나는 시도했다.

이렇게하는 더 좋은 방법은 없을까요?

답변

5

무슨 말씀 이세요? 그 from i in c.Invoice.DefaultIfEmpty() 정확히 왼쪽 가입입니다.

ValueOfStringIs|Foo| ValueOfCharIs|70| 
ValueOfStringIs|Foo| ValueOfCharIs|111| 
ValueOfStringIs|Foo| ValueOfCharIs|111| 
ValueOfStringIs|| ValueOfCharIs|0| 
+1

글쎄, 나를 무너 뜨리는 - 당신 말이 맞아! 자, 내가 왜 이것이 효과가 없다고 생각 했는가 ...? OK, 나는 겸손하게 물러났다 ...이 질문은 내 자신의 오해에서 비롯된 것이다. 감사! :) –

2

'입력'키워드를 사용하는 것이 좋습니다.

Example

+0

감사합니다, 그러나 이것은 정말 내 질문에 대답하지 않습니다 ...되지는 관계가 이미 정의되어 있다는 사실을 활용, 더 나은 방법이있다 :

 List<string> strings = new List<string>() { "Foo", "" }; var q = from s in strings from c in s.DefaultIfEmpty() select new { s, c }; foreach (var x in q) { Console.WriteLine("ValueOfStringIs|{0}| ValueOfCharIs|{1}|", x.s, (int)x.c); } 

이 테스트는 생산? –

6

의 관계는 이미 그 관계를 사용해야하는 경우 자동으로 확인할 수 없습니다 (데이터베이스와하면 .dbml 마크 업 모두) 런타임 정의된다.

개체 모델에 두 개의 관계가있는 경우 (Person은 부모 및 자식을 가지며 다른 Person 인스턴스와 두 관계가 있음). 케이스가 특수 케이스 일 수는 있지만, 시스템이 복잡해질 수 있습니다 (버그가 많음). SQL에서 당신은 관계의 명세를 되풀이 할 것임을 기억하십시오.

인덱스와 키는 구현 세부 사항이며 관계 모델의 기초가되는 관계형 대수의 일부가 아닙니다.

from c in Customers 
join i in Invoices on i.CustomerId equals c.CustomerId into inv 
... 

와 INV 가능성이없는 경우에, 유형 IEnumerable<Invoivce>이있을 것이다 : 당신은 LEFT OUTER는 "into"를 사용할 필요가 다음 가입하려면

.

+0

+1 좋은 답변이지만 여전히 내 포인트를 놓치고 있습니다.송장에는 특별히 "고객"관계가 정의되어 있으며 "송장"이 아닌 "c.Invoices"관계를 활용하고자합니다. 그것을 할 방법이 있습니까? –

+0

@Shaul : 그렇다면 표현에 c.Invoices를 사용하십시오. 다른 식별자를 원하면 let 절을 사용하십시오. – Richard