2016-09-02 1 views
2

에 영향을 미치는되지 내가 테스트 케이스로 구성 : IdA이 자료는 기본 키 나는이컬렉션

Id|IdA|IdW|Quantity 
1 1 3 5 
2 1 4 2 
3 2 5 3 

Id 같은 테이블이

을하다 , IdW은 상자 ID이며 수량은 기사의 양입니다.

는 지금은 수량을 합산 IdA에 의해 그룹에, 그래서 내가하고 있어요 :

여기 models
var groups = 
     models 
      .GroupBy(x => new { x.IdA }) 
      .Select 
      (
       x => 
        new Model 
        { 
         Id = (x.Select(y => y.Id).Count() > 1) ? 0 : x.Select(y => y.Id).First(), 
         IdA = x.Key.IdA, 
         Qty = x.Sum(y => y.Qty) 
        } 
      ); 

위의 테이블입니다. 그것은 잘 작동합니다, 나는 또한 그룹화가 이루어지지 않을 때 프라이 머리 키를 유지할 수있었습니다. (오직 하나만 존재합니다.)

이제 이것을하고 싶습니다 : 그룹화되지 않은 것들에 대해 IdW을 유지하고 싶습니다. . 이상적인 결과는 다음과 같습니다

foreach(var e in groups) 
{ 
    var nonGroupedRow = models.Where(x => e.Id != 0 && x.Id == e.Id).FirstOrDefault(); 
    var targetModel = groups.FirstOrDefault(x => x.Id == e.Id); 
    if(nonGroupedRow != null && targetModel != null) 
    { 
     targetModel.IdW = nonGroupedRow.IdW; 
    } 
} 

: 나는 차 키를 사용하여 행을 검색, 다음과 같이 그룹에 IdW을 설정, 그룹에 foreach 문을하려고 노력

Id|IdA|IdW|Quantity 
0 1 0 7 
3 2 5 3 

이것은 엄청나게 효과가 없습니다. 두 그룹 모두 여전히 IdW = 0입니다. 또한 위의 여기 예를 주어,

void Main() 
{ 
    var a = new List<A> { new A { Id = 1 }, new A { Id = 2 } }; 
    a.FirstOrDefault(x => x.Id == 1).Id = 2; 
    // both have Id = 2 
} 

class A 
{ 
    public long Id {get;set;} 
} 

그냥 내 머리 속에서 일해야, 아직 아니에요 : 나는 또한하고, 확인하기 위해 또 다른 테스트를했다. 내가 어디서 잘못한거야?

+0

당신이'Id'을 어떻게 거의 동일해야했다. 그리고 그것은'x.Count()> 1로 단축 될 수 있습니까? 0 : x.First(). Id'. – juharr

+0

왼쪽 외부 조인을 사용하십시오. msdn : https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b – jdweng

답변

0

은 첫째로 당신의 카운트는, 첫 번째의 ID를 검색하기 위해 동일한

두 번째로 같은 일이 될 것입니다 당신이 아이디의를 계산을 지정할 필요가 없습니다 있도록하여 그룹에있는 항목의 양을 계산한다 이

에서 다음 아이디 속성을 그룹화 된 데이터에서 첫 번째 항목을 당신은 기본적으로 대답

var groups = 
     models 
     .GroupBy(x => new { x.IdA }) 
     .Select 
     (
      x => 
       new Model 
       { 
        Id = (x.Count() > 1) ? 0 : x.First().Id, 
        IdA = x.Key.IdA, 
        IdW = (x.Count() > 1) ? 0 : x.First().IdW, 
        Qty = x.Sum(y => y.Qty) 
       } 
     ); 
+0

참조하십시오. 아래쪽 투표를 설명하십시오. – Neil

+0

정말이 문제가 아닙니다. 감사 – Phate01