2012-06-11 39 views
3

我想從我的程序中的谷歌圖表數據庫中獲取數據。我想創建的,而不是一遍一遍的重複我的代碼匿名類型(VAR)的數組:創建一個匿名類型的數組

public JsonResult GetChartData(int sID, int regionID) 
    { 

      var testPathOne = from p in _rep.GetMetricsData().GetLHDb().page_loads         
           where p.t_3id == sID && p.test_path_id == 1 
           select new { time = p.time, created_at = p.created_at }; 

      var testPathTwo = from p in _rep.GetMetricsData().GetLHDb().page_loads 
           where p.t_3id == sID && p.test_path_id == 2 
           select new { time = p.time, created_at = p.created_at }; 

      var tOne = testPathOne.ToArray(); 
      var tTwo = testPathTwo.ToArray(); 
      var name = new { test1 = tOne, test2 = tTwo }; 
      return Json(name); 
     } 

我知道我需要一個for循環,所以我可以去通過所有的測試路徑的ID,而不是硬編碼他們這樣p.test_path_id == 1,但我的問題是如何將使得這部分動態var name = new { test1 = tOne, test2 = tTwo };

編輯: 我道歉,我願意做這樣的事情:

name is an array 

for loop: 
    testPath = query 
    name.Add(testPath) 

我希望有道理

+6

你是什麼意思「使這部分動態」?動態以什麼方式?真的不清楚你想要達到什麼。如果你正在尋找動態屬性名稱,你可以看看'ExpandoObject',但我認爲你最好直接構建JSON ...... –

+1

我不明白這個問題。只要仔細檢查,'var'只能用於編譯器可以在編譯時完全確定**的情況**'var'代表的類型。如果直到運行時才能確定類型,則可以考慮使用'dynamic',但我不確定這是如何適合這種特殊情況的。 – sblom

+0

我想他想把這兩個列表返回給單個json。 –

回答

3

在這種特殊情況下,最簡單的解決方案就是給當前匿名的類命名。雖然有可以使用的解決方法,但當您需要開始真正努力使用匿名類型時,您可能不應該使用它。它可以讓某些任務更快更輕鬆;如果這種情況沒有發生,那麼你可能會更喜歡真正的課堂。

這種解決方案會是這個樣子:

//Please give me a real name 
public class ClassToBeRenamed 
{ 
    public DateTime Time { get; set; } 
    public DateTime CreatedAt { get; set; } 
} 

List<ClassToBeRenamed[]> myList = new List<ClassToBeRenamed[]>(); 

for (int i = 0; i < 10; i++) 
{ 
myList.Add((from p in _rep.GetMetricsData().GetLHDb().page_loads 
      where p.t_3id == sID && p.test_path_id == i 
      select new ClassToBeRenamed { Time = p.time, CreatedAt = p.created_at }) 
      .ToArray()); 
} 

說了這一切,它仍然是可能的。

var myList = new[]{ 
       from p in _rep.GetMetricsData().GetLHDb().page_loads 
       where p.t_3id == sID && p.test_path_id == 1 
       select new { time = p.time, created_at = p.created_at }.ToArray() 
}.ToList(); 

for (int i = 2; i < 10; i++) 
{ 
    myList.Add(from p in _rep.GetMetricsData().GetLHDb().page_loads 
       where p.t_3id == sID && p.test_path_id == i 
       select new { time = p.time, created_at = p.created_at }.ToArray() 
       ); 
} 

var myArray = myList.ToArray(); 

如果這是真的,真的很重要的是你有一個數組,而不是一個列表,那麼你可以在最後呼籲myList中ToArray。從列表開始,並且最終將其轉換爲數組非常重要,因爲數組創建後具有固定的大小。你可以改變他們的內容,但是你不能讓它們變大或變小。另一方面,列表的目的是隨時間變化它的大小,所以它可以從0或1個項目開始,然後隨着時間的推移添加項目,這對於我們在這個特定的上下文中是重要的。 (這實際上非常有用,這就是爲什麼在陣列上使用List經常有用。)

+0

你已經混合到不同的列表,這在這裏是不可取的。 –

+0

哦,好吧,這是有道理的。但是關於創建一個單獨的類,你的意思是創建一個只包含'time'和'created_at'的類?你能詳細解釋一下嗎?感謝 – SherCoder

+0

@SherCoder是的,我做的。我已經添加了一個顯示該方法的代碼片段。 – Servy

1

而不是使用LINQ使用foreach循環。 LINQ更受限於你。 也可以在開始時定義您的ArrayLists並隨時添加到它們中。

var test1 = new ArrayList(); 
var test2 = new ArrayList(); 
foreach(PageLoad p in _rep.GetMetricsData().GetLHDb().page_loads) 
{ 
    if(p.t_3id == sID) 
    { 
     var tr = new { time = p.time, created_at = p.created_at }; 
     switch(p.test_path_id) 
     { 
      case 1: test1.Add(tr); break; 
      case 2: test2.Add(tr); break; 
     } 
    } 
} 
return Json(new { test1, test2, }); 

你不需要定義屬性匿名類型的名稱,因爲它們默認的變量名。