2016-03-02 83 views
1

我正在嘗試執行一個linq查詢,該查詢將返回JQuery結果爲jQuery圖表。Linq查詢獲取Json結果

我有運動的對象的列表:

MovementId 
MovedFrom 
MovedTo 

所以示例數據將是:

1, Sydney, Melbourne 
2, Dallas, Boston 
3, Boston, Dallas 
4, Boston, Dallas 
5, Sydney, Brisbane 

我想要得到的結果是這樣的:

categories: Boston, Brisbane, Dallas, Melbourne, Sydney (note in alphabetical order) 
leaving: 2, 0, 1, 0, 2 
arriving: 1, 1, 2, 1, 0 

所以2人已經離開波士頓,1人已經抵達

我試過到目前爲止:

我可以用下面的行查詢,以獲得不同的值,並把它們合併得到的類別:

return Json(new 
{ 
    categories = movements 
      .Select(m => new[] { m.MovedFrom, m.MovedTo }) 
      .SelectMany(i => i) 
      .Distinct() 
      .ToList() 
}); 

不過,我似乎無法得到一個OrderBy正在努力將這些按順序排列。

我還沒有找到如何獲得離開和到達的值。想到的是一個將它們放入數組中的foreach,但希望有一個很好的方法可以通過linq執行它

回答

1

這應做到:

var cities = movements 
    .Select(m => new[] { m.MovedFrom, m.MovedTo }) 
    .SelectMany(n => n) 
    .Distinct() 
    .OrderBy(n => n) 
    .Select(n => new 
    { 
     category = n, 
     leaving = movements.Count(m => m.MovedFrom == n), 
     arriving = movements.Count(m => m.MovedTo == n) 
    }) 
    .ToList(); 

var result = new 
{ 
    categories = cities.Select(c => c.category).ToList(), 
    leaving = cities.Select(c => c.leaving).ToList(), 
    arriving = cities.Select(c => c.arriving).ToList() 
}; 

return Json(result); 

小提琴:https://dotnetfiddle.net/eLCcJt

1

我不確定這是否是您想要的。這不是最好的方法,但你可以試試這個嗎?

     movements 
         .Select(m => new[] { m.MovedFrom, m.MovedTo }) 
         .SelectMany(i => i) 
         .Distinct() 
         .OrderBy(e => e) 
         .Select(e => new 
         { 
          categories = e, 
          leaving = movements.Count(x => x.MovedFrom == e), 
          arriving = movements.Count(x => x.MovedTo == e) 
         }); 
0

我不確定是否有比這更短的方式,但這會產生你想要的輸出。首先爲你的圖表視圖創建一個視圖模型類。

  List<MovementObject> movements = new List<MovementObject>() 
      { 
       new MovementObject() { MovementId = 1, MovedFrom = "Sydney", MovedTo = "Melbourne"}, 
       new MovementObject() { MovementId = 2, MovedFrom = "Dallas", MovedTo = "Boston"}, 
       new MovementObject() { MovementId = 3, MovedFrom = "Boston", MovedTo = "Dallas"}, 
       new MovementObject() { MovementId = 4, MovedFrom = "Boston", MovedTo = "Dallas"}, 
       new MovementObject() { MovementId = 5, MovedFrom = "Sydney", MovedTo = "Brisbane"}, 
      }; 

      var categories = movements 
      .Select(m => new[] { m.MovedFrom, m.MovedTo }) 
      .SelectMany(i => i) 
      .Distinct() 
      .ToList(); 

      MovementChartViewModel viewModel = new MovementChartViewModel(); 

      foreach(var category in categories.OrderBy(category => category)) //For alphabetical order 
      { 
       viewModel.Categories.Add(category); 
       viewModel.Leaving.Add(movements.Where(move => move.MovedFrom == category).Count()); 
       viewModel.Arriving.Add(movements.Where(move => move.MovedTo == category).Count()); 
      } 
      return Json(new { viewModel }); 

型號:

 public class MovementChartViewModel 
     { 
      public MovementChartViewModel() 
      { 
       Categories = new List<string>(); 
       Leaving = new List<int>(); 
       Arriving = new List<int>(); 
      } 

      public List<string> Categories { get; set; } 
      public List<int> Leaving { get; set; } 
      public List<int> Arriving { get; set; } 
     } 

     public class MovementObject 
     { 
      public int MovementId {get;set;} 
      public string MovedFrom {get;set;} 
      public string MovedTo { get; set; } 
     }