2014-04-30 2 views
0

데이터베이스에서 결과를 얻었습니다. 약간 마사지를 받고 목록에 저장됩니다. 이 목록 내에서, 그 결과는 다음과 같이 보일 것이다 : 당신은 다른 관점에서 본다면Linq을 통해 컬렉션에서 일치하지 않는 항목을 찾고

Field 1: ID1 
Field 2: ID2 
Summary: AA 
Value: 15 

Field 1: ID3 
Field 2: ID2 
Summary: AA 
Value 20 

Field 1: ID1 
Field 2: ID4 
Summary: AA 
Value 25 

Field 1: ID1 
Field 2: ID4 
Summary: AA 
Value 5 

Field 1: ID1 
Field 2: ID4 
Summary: AB 
Value 5 

것은,이 격자처럼 보일 것이다 :

  ID2 ID4 
ID1: AA 15 30 
ID1: AB   5 
ID3: AA 20 

모든 값을 (예 : ID4, ID1, 요약 AA)가 함께 추가 될 수 있습니다. 교차점에 존재하지 않는 데이터에 0 값을 적용하면됩니다. 따라서 ID2/ID1/AB는 존재하지 않습니다. 내 목록에 '존재'하지만 값이 0 인 항목이 있어야합니다.
모든 도움을 주실 수 있습니다.

+0

당신이 당신의 Visual Studio에서 일부 코드가 있습니까? 여기에 붙여 넣으십시오. –

+0

아마도 null 병합 연산자의 경우입니다. ?? http://msdn.microsoft.com/en-GB/library/ms173224.aspx –

답변

1
var items = new [] { 
    new { F1 = "ID1", F2 = "ID2", S = "AA", V = 15 }, 
    new { F1 = "ID3", F2 = "ID2", S = "AA", V = 20 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 25 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AA", V = 5 }, 
    new { F1 = "ID1", F2 = "ID4", S = "AB", V = 5 }, 
}; 

var f2s = items.Select(i => i.F2).Distinct(); 

var table = 
    from i in items 
    group i by new { i.F1, i.S } into g 
    select new 
    { 
     g.Key, 
     V = 
      from f in f2s 
      join x in g on f equals x.F2 into ps 
      from p in ps.DefaultIfEmpty() 
      select new { F = f, V = p != null ? p.V : 0 } into w 
      group w by w.F into h 
      select new { h.Key, V = h.Sum(c => c.V) } 
    }; 
+0

환상적입니다. 고맙습니다. – furiousgreg

+0

.DefaultIfEmpty()가 필요한 이유는 무엇입니까? 매개 변수를 전달하지 않으면 중복 된 것처럼 보입니다 ... 아니면 유스 케이스가 누락 되었습니까? – Flater

+0

@Flater 예, 그는 여전히 0을 명시 적으로보고 싶어합니다. Linqpad에서 테스트하면 차이점을 확인할 수 있습니다. 'DefaultIfEmpty'는 기본값을 결정하는 것이 아니라 '누락 된 항목'에 대한 데이터를 생성하는 것입니다 (디폴트 값의 형태로,이 경우'null'). – Wasp

관련 문제