2011-06-22 45 views
6

Truy vấn sau đang hoạt động thành công.Không thể trả lại 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); 

Bây giờ tôi muốn quay trở lại JsonResult như như

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); 

Nhưng nó sẽ mang lại cho tôi một lỗi như: Kiểu mảng 'System.String []' không thể được khởi tạo trong kết quả truy vấn . Thay vào đó, hãy cân nhắc sử dụng 'System.Collections.Generic.List`1 [System.String]'.

Tôi nên làm gì để có kết quả mong đợi?

Trả lời

8

tôi nghi ngờ rằng nó đơn giản như đẩy phần cuối cùng vào một truy vấn trong quá trình sử dụng 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); 

Bạn có thể muốn kéo truy vấn mà ra khỏi loại initializer ẩn danh, cho rõ ràng:

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

Giải pháp tuyệt vời ...! – imdadhusen

+0

cách sử dụng OrderBy là sidx và OrderType là sord trong truy vấn sau 'var tabs = ( từ r trong db.TabMasters orderby r.colID chọn new {r.colID, r.FirstName, r.LastName}) . Bỏ qua (hàng * (trang - 1)) Lấy (hàng), ' ** Tôi muốn thay thế trật tự r.colID sang sidx và giảm dần hoặc '' ** – imdadhusen

+0

@imdadhusen: Nó không thực sự rõ ràng ý bạn là gì , nhưng có vẻ như nó sẽ được hỏi tốt hơn là một câu hỏi riêng biệt. –

1

Đó là vì nó thêm vào truy vấn LINQ là tabs IQueryable của bạn. Đó là sau đó cố gắng để biến biểu thức LINQ thành một truy vấn SQL và nhà cung cấp không hỗ trợ các mảng chiếu.

Bạn có thể thay đổi việc gán biểu thức LINQ của biến tab thành sử dụng ToList để thực hiện kết quả DB ngay sau đó và ở đó hoặc bạn có thể thêm .AsEnumerable() vào biểu thức LINQ được gán cho trường rows đó là JsonResult của bạn. AsEnumerable sẽ giảm hạng IQueryable thành một IEnumerable mà sẽ ngăn chặn truy vấn LINQ thứ hai của bạn từ cố gắng để được thêm vào truy vấn DB và chỉ làm cho nó một cuộc gọi LINQ-to-đối tượng như nó cần phải được.

Các vấn đề liên quan