2017-01-11 5 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 

Фактические результаты: (07-01-2016 отсутствует)

"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

Используйте внешнее соединение, которое будет возвращать все результаты из первого набора, и матч, где это возможно, давая аннулирует во втором сете, где нет совпадений не найдено.

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); 
Смежные вопросы