2017-01-11 4 views
1

두 개의 목록을 존재하는 데이터와 존재하지 않는 데이터로 병합하려고 시도하고 있습니다.문제 두 목록 병합

기본적으로 startDate 및 endDate를 전달할 때 사이에 달의 압축을 풀고 목록을 만든 다음 데이터베이스를 호출하고 데이터를 검색하여 첫 번째 목록에 병합해야합니다. 나는 이것을 성공적으로 해냈다. 그러나 데이터가 포함 된 월 대신 전체 목록을 반환해야합니다.

startDate is 5-1-2016 
endate is 7-14-2016 

코드 :

//Create the empty list 
     if (dateRange == "m") 
     { 

      List<DataObject> MonthList = new List<DataObject>(); 

      for (DateTime dt = startDate; dt <= endDate; dt = dt.AddMonths(1)) 
      { 
       var insertDate = new DateTime(dt.Year, dt.Month, dt.Day); 
       MonthList.Add(new DataObject 
       { 
        data_date = insertDate, 
        dataParam1 = 0, 
        dataParam2 = 0, 
        dataParam3 = 0, 
        dataParam4 = 0, 
        dataParam5 = 0 
       }); 
      } 

//Get the Data 

      List<DataObject> value = 
        dctx.QueryStoredProcedure<DataObject>("sproc", 
         parameters).ToList(); 

// 병합 목록

var result = value.Join(MonthList, arg => arg.data_date, arg => arg.data_date, 
       (x, y) => 
        new DataObject 
        { 
         data_date = y.data_date, 
         dataParam1 = x.Calories, 
         dataParam2 = x.ActiveMinutes, 
         dataParam3 = x.Duration, 
         dataParam4 = x.Distance, 
         dataParam5 = x.Steps 
        }).ToList(); 

예상 결과 :

"data_date": "2016-05-01T00:00:00", 
"dataParam1": 195007, 
"dataParam2": 163069, 
"dataParam3": 0, 
"dataParam4": 0, 
"dataParam5": 951087 

"data_date": "2016-06-01T00:00:00", 
"dataParam1": 416647, 
"dataParam2": 265536, 
"dataParam3": 0, 
"dataParam4": 0, 
"dataParam5": 1650185 

"data_date": "2016-07-01T00:00:00", 
"dataParam1": 0, 
"dataParam2": 0, 
"dataParam3": 0, 
"dataParam4": 0, 
"dataParam5": 0 

실제 결과 : (2016년 7월 1일 누락)

"data_date": "2016-05-01T00:00:00", 
"dataParam1": 195007, 
"dataParam2": 163069, 
"dataParam3": 0, 
"dataParam4": 0, 
"dataParam5": 951087 

"data_date": "2016-06-01T00:00:00", 
"dataParam1": 416647, 
"dataParam2": 265536, 
"dataParam3": 0, 
"dataParam4": 0, 
"dataParam5": 1650185 

나는 그것이 병합에 있다고 확신하지만 GroupJoin을 시도하려고 시도했지만 y 값을 가져 와서 개체 속성을 채울 수 없습니다. 나는 틀린 일을 분명히하고있다.

+0

내 대답이 귀하의 질문을 해결 했습니까? 그랬다면 동의하거나 내가 도와 줄 수있는 다른 것을 알려주십시오. 감사. – ChiralMichael

답변

2

에 가입 교차점을 필요로하는 곳에 가능하면 일치하는 항목이없는 경우 두 번째 세트에서 널 (null)을 제공.

var result = (from month in MonthList 
    join v in value on month.data_date equals v.data_date into vg 
    join v in vg.DefaultIfEmpty() 
    select new DataObject 
       { 
        data_date = month.data_date, 
        dataParam1 = v?.Calories ?? 0, 
        dataParam2 = v?.ActiveMinutes ?? 0, 
        dataParam3 = v?.Duration ?? 0, 
        dataParam4 = v?.Distance ?? 0, 
        dataParam5 = v?.Steps ?? 0 
       }).ToList(); 

즉,이 작업은 실제로 이상한 방법으로 보입니다. 오히려 프레젠테이션 레이어에서 누락 된 달을 처리해야합니다.

0

당신은 아닌는 첫 세트에서 모든 결과를 반환합니다 외부 조인, 및 검색을 사용

list.Intersect(otherList);