2012-06-11 40 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, }); 

你不需要定义属性匿名类型的名称,因为它们默认的变量名。