2012-06-06 2 views
0

세 개의 테이블에 대해 왼쪽 외부 조인을 수행하려고합니다. 하나의 변수에서 그것을 할 수있는 방법이 있다는 것을 압니다. 그러나 그것을 이해할 수는 없습니다. 대신 두 개의 왼쪽 외부 조인을 수행 한 다음 나머지 조인을 수행했습니다. 여기에 대한 내 코드는 다음과 같습니다.더 나은 방법을 찾고 LINQ의 세 테이블에서 왼쪽 외부 조인

var outerJoin1 =  

    (from h in resultHours 
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer 
    from grouping in outer.DefaultIfEmpty() 
    select new {timeKey = h, Key = grouping}); 

var outerJoin2 =  

    (from h in resultHours 
    join s in serviceHrsResults on new {h.PhysicalUnitId, h.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2 
    from grouping in outer2.DefaultIfEmpty() 
    select new {timeKey = h, Key = grouping}); 

var outerJoin = 

    (from a in outerJoin1 
    join b in outerJoin2 on new {a.timeKey.PlantId, a.timeKey.MonthNum} equals new {b.timeKey.PlantId, b.timeKey.MonthNum} into outer 
    from grouping in outer.DefaultIfEmpty() 
    select new{timeKey = a, Key = grouping}).Distinct(); 

위의 코드를 하나의 변수에 넣으면 작동하지 않습니다. 다음은 내가 시도한 것입니다 :

var outerjoin = 

    from h in resultHours 
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer 
    from grouping in outer.DefaultIfEmpty() 
    from hr in resultHours 
    join s in serviceHrsResults on new {hr.PhysicalUnitId, hr.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2 
    from grouping in outer2.DefaultIfEmpty() 
    select new {timeKey = h && timeKey = hr, Key = grouping}; 

이 문제는 두 개의 그룹이 충돌하는 것입니다. 난 그냥 선택하기 전에 바로 그룹화가 필요하지만 "그룹화"를 사용하는 방법을 알아낼 수 없어 둘 다 outer.DefaultIfEmpty() 및 outer2.DefaultIfEmpty() 포함 할 꽤 확신 해요.

누군가가 나를 가르쳐 주시면 감사하겠습니다.

답변

1

중복 범위 변수 ID를 사용하고 있습니다. 사용자는 2x grouping입니다.
- 결과 집합에서 원하는 그룹은 무엇입니까? -이 줄은 무엇을 성취 할 것으로 예상됩니까? timeKey = h && timeKey = hr - 어떻게 이것을 투영에 결합하고 싶습니까?

나는 아래 쿼리를 시도 할 것이지만, select 부분을 결합 된 버전이 나에게 의미가 없으므로 변경했습니다.

데이터가 없으면 테스트 할 수 없으므로 알려 주시면 새 버전이 제대로 작동하는지 확인할 수 없습니다.

var outerjoin = 
    from h in resultHours 
    join u in results on new {h.PhysicalUnitId, h.MonthNum} equals new {u.PhysicalUnitId, u.MonthNum} into outer 
    from grouping1 in outer.DefaultIfEmpty() 
    //from hr in resultHours 
    join s in serviceHrsResults on new {grouping1.PhysicalUnitId, grouping1.MonthNum} equals new {s.PhysicalUnitId, s.MonthNum} into outer2 
    from grouping2 in outer2.DefaultIfEmpty() 
    select new {timeKey = h, Key1 = grouping1, Key2 = grouping2}; 
관련 문제