2011-06-22 110 views
6

以下查詢已成功運行。無法返回JsonResult

var tabs = (
       from r in db.TabMasters 
       orderby r.colID 
       select new { r.colID, r.FirstName, r.LastName }) 
       .Skip(rows * (page - 1)).Take(rows); 

現在我想回到JsonResult像

var jsonData = new 
      { 
       total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
       page = page, 
       records = totalRecords, 
       rows = (from r in tabs 
         select new { id = r.colID, cell = new string[] { r.FirstName, r.LastName } }).ToArray() 
      }; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

但它給了我一個錯誤,如: 的陣列式「System.String []」不能在查詢結果初始化。考慮使用'System.Collections.Generic.List`1 [System.String]'來代替。

我該怎麼做才能獲得預期的結果?

回答

8

我懷疑,這是因爲使用AsEnumerable()推最後一部分成一個進程查詢一樣簡單:

var jsonData = new 
{ 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page = page, 
    records = totalRecords, 
    rows = (from r in tabs.AsEnumerable() 
      select new { id = r.colID, 
         cell = new[] { r.FirstName, r.LastName } } 
      ).ToArray() 
}; 
return Json(jsonData, JsonRequestBehavior.AllowGet); 

您可能需要拉該查詢出來的匿名類型初始化的,爲了清楚:

var rows = tabs.AsEnumerable() 
       .Select(r => new { id = r.colID, 
            cell = new[] { r.FirstName, r.LastName }) 
       .ToArray(); 

var jsonData = new { 
    total = (int)Math.Ceiling((float)totalRecords/(float)rows), 
    page, 
    records = totalRecords, 
    rows 
}; 
+1

優秀的解決方案...! – imdadhusen

+0

如何使用OrderBy是sidx和OrderType是在以下查詢'var tabs =( from db.TabMasters orderby r.colID select new {r.colID,r.FirstName,r.LastName}) 。跳過(rows *(page - 1))。取(rows);' **我想用order by r.colID替換爲sidx並降序或''** – imdadhusen

+0

@imdadhusen:這不是很明顯你的意思,但它看起來好像是一個單獨的問題。 –

1

這是因爲它增加了LINQ查詢,它是你的tabs IQueryable。然後嘗試將LINQ表達式轉換爲SQL查詢,並且提供程序不支持投影數組。

您可以更改tabs變量的LINQ表達式的賦值,以使用ToList實現當時和之後的DB結果,也可以將.AsEnumerable()添加到分配給匿名類型rows字段的LINQ表達式中那是你的JsonResult。 AsEnumerable會將IQueryable降級爲IEnumerable,這將阻止您的第二個LINQ查詢嘗試添加到數據庫查詢中,並使其成爲像需要的LINQ到對象的調用。