문제

나는 IEnumerable<DataRow> 형태로 table1 및 table2가있다. 두 테이블에는 C 럼 Column1Column2가 있습니다.

Column1에서 왼쪽 외부 조인을 수행하고 Table2에있는 행 수를 얻고 레코드를 DataTable에로드하고 싶습니다.

다음 쿼리를 시도했습니다

var query = from p in Table1
            join q in Table2 on p.Field<string>("Column1") equals q.Field<string>("Column1") into pq
            from xyz in pq.DefaultIfEmpty()
            group xyz by new { Col1 = p.Field<string>("Column1"), Col2 = p.Field<string>("Column2") } into g
            select dtFinalData.LoadDataRow(new object[]
            {
                g.Key.Col1,
                g.Key.Col2,                               
                g.Count
            }, false);
.

'g'가 그룹화 된 데이터를 나타 내기 때문에 g.count는 표 2에 항목이없는 행에 대해 1을 반환합니다.이 행에 대해 '0'을 반환하고 싶습니다.

입력 :

표 1

Col1Val1       Col2Val1

Col1Val2       Col2Val2
.

표 2

Col1Val1       Col2Val1

Col1Val1       Col2Val1
.

전류 출력 :

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    1
.

예상 결과 :

Col1Val1        Col2Val1    2

Col2Val2        Col2Val2    0
.

나는 LINQ - left join, group by, count < / a> 그러나 나는 내 쿼리에 똑같이 적용 할 수 없었습니다 ...

이 쿼리를 수정하는 데 도움을 줄 수 있습니까?

도움이 되었습니까?

해결책

let는 그렇게합니다 :

from p in Table1
let p1 = p.Field<string>("Column1")
let p2 = p.Field<string>("Column2") 
let qs = 
  from q in Table2
  where p1 == q.Field<string>("Column1")
  select q
let qCount = qs.Count()
select dtFinalData.LoadDataRow(new object[]
{
  p1,
  p2,
  qCount
}, false);
.

나는 결합하지 않았으므로, 나는 그룹 할 필요가 없다.각 결과 행은 table1의 행에 해당합니다.


여기에 GroupJoin 솔루션이 있습니다 :

from p in Table1 
let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
join q in Table2 on pkey equals
  new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
  into qs
select dtFinalData.LoadDataRow(new object[] 
{ 
  pkey.c1, 
  pkey.c2, 
  qs.Count() 
}, false); 
.

와 여기에는 가입 및 그룹 해결책이 있습니다.

from p in Table1 
let pkey = new { c1 = p.Field<string>("Column1"), c2 = p.Field<string>("Column2") }
join q in Table2 on pkey equals
  new { c1 = q.Field<string>("Column1"), c2 = q.Field<string>("Column2") }
  into right
from q in right.DefaultIfEmpty()
group q by pkey into g
select dtFinalData.LoadDataRow(new object[] 
{ 
  g.Key.c1, 
  g.Key.c2, 
  g.Count(q => q != null) 
}, false); 
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top