여러 열과 카운트로 그룹
-
13-09-2020 - |
문제
나는 IEnumerable<DataRow>
형태로 table1 및 table2가있다. 두 테이블에는 C 럼 Column1
및 Column2
가 있습니다.
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);
. 제휴하지 않습니다 StackOverflow