2013-12-12 104 views
0

請幫忙。剃鬚刀我頭痛。我正在嘗試使用谷歌圖表來顯示我的信息。剃鬚刀foreach循環和javascript

所以,這是我在我的觀點:

@section scripts 
{ 
    <script type="text/javascript" src="https://www.google.com/jsapi"></script> 
    <script type="text/javascript"> 
     google.load("visualization", "1", { packages: ["corechart"] }); 
     google.setOnLoadCallback(drawChart); 
     function drawChart() { 
      var data = google.visualization.arrayToDataTable([ 
      ['Date', 'DDM'], 
       @foreach(var item in Model.ToList()) 
       { 
        <text> 
         ['item.Item1', 'item.Item2'] 
        </text> 
       } 
     ]); 

      var options = { 
       title: 'Demande de marché', 
       hAxis: { title: 'Date', titleTextStyle: { color: '#333'} } 
      }; 

      var chart = new google.visualization.AreaChart(document.getElementById('chart_div')); 
      chart.draw(data, options); 
     } 
    </script> 
} 

我使用foreach循環迭代模型上(IEnumerable<Tuple<DateTime,int>>)在javascript函數添加的信息。在設計時,我得到

Conditional compilation is turned off 

有沒有人知道如何解決這個問題?

感謝

編輯: 這是控制器:

public ActionResult DDMPerDepartment(string department) 
     { 
      if (DepartmentsList == null) DepartmentsList = _db.Departments.ToList(); 
      ViewBag.DepartmentString = DepartmentsList.First().DepartmentName; 

      IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers.Where(x => x.Department.Id == 1).Select(x => new Tuple<DateTime, int>(x.Date, x.Number)); 
      return View(points); 
     } 
+1

可能重複[條件編譯在剃刀關閉?(http://stackoverflow.com/questions/6655696/conditional-compilation-is-turned-off-in-razor) – wudzik

回答

3

你必須在代碼中的一些錯誤:

  1. 你把字符串 'item.Item1',而不是的變量item的財產Item1的價值。改爲使用'@(item.Item1)'

  2. 您在foreach循環中的每個項目末尾缺少一個逗號。因此注入的javascript是無效的。您需要

    <文本> [ '@(item.Item1)', '@(item.Item2)'],< /文>

編輯:

OK,所以問題出在LINQ to實體查詢上面。

IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers.Where(x => x.Department.Id == 1).Select(x => new Tuple<DateTime, int>(x.Date, x.Number)); 

實體框架需要能夠將此查詢轉換爲SQL查詢,因此不接受查詢中的參數使用構造函數。上面的WhereSelect子句組合成一個SQL查詢。

可能的解決方法是先評估需要在數據庫上運行的表達式部分,將數據返回到內存,然後在內存中創建元組。有許多LINQ方法的重載,其中一些爲LINQ to實體創建表達式,一些在內存中執行LINQ操作。您需要確保創建元組的select在內存中執行,即您不希望過載適用於IQueryable<T>

IEnumerable<Tuple<DateTime,int>> points = _db.DepartmentNumbers 
    .Where(x => x.Department.Id == 1) // LINQ to Entities WHERE 
    .Select(x => new { x.Date, x.Number }) // LINQ to Entities SELECT 
    .AsEnumerable() // We want the next statement to be a select on IEnumerable instead of IQueryable. 
    .Select(x => new Tuple<DateTime, int>(x.Date, x.Number)); // In-memory SELECT 
+0

我得到的在foreach語句上出現錯誤。我仍然有這個問題。在運行時,我在foreach行有一個異常,聲明「只有無參數的構造函數和初始化器在LINQ to Entities中受支持。」 – Daniel

+0

我明白了,所以問題可能出現在你的模型中。你能發佈模型的代碼嗎? –

+0

我編輯的主題;) – Daniel