2017-01-11 8 views
1

2つのリストを存在するデータと存在しないデータでマージしようとしています。問題2つのリストをマージする

基本的には、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); 
関連する問題