2009-06-19 31 views
0

我想寫一個linq到sql方法,它處理ajax網格的排序,分頁和過濾。我創建了一個具有TotalRecordCount的分部類Employee,因爲我需要將它傳遞給javascript來設置分頁器。問題是它不會生成,因爲我不能設置AnonymousType#1.TotalRecordCount,它是隻讀的。但是,如果我選擇「新員工」,那麼它將拋出異常 - 「不允許在查詢中顯式構造實體類型'InVision.Data.Employee'」。Linq to SQL的問題 - 指定列然後修改列

下面的代碼...

public string GetPageJSON(string sortColumn, string sortDirection, int pageNumber, int pageSize, EmployeeSearch search) 
     { 
      var query = from e in db.Employees 
         select new 
         { 
          EmployeeID = e.EmployeeID, 
          FirstName = e.FirstName, 
          LastName = e.LastName, 
          LoginName = e.LoginName, 
          IsLockedOut = e.IsLockedOut, 
          TotalRecordCount = e.TotalRecordCount 
         }; 
      //searching. 
      if (search.FirstName.Length > 0) query = query.Where(e => e.FirstName.Contains(search.FirstName)); 
      if (search.LastName.Length > 0) query = query.Where(e => e.LastName.Contains(search.LastName)); 
      if (search.LoginName.Length > 0) query = query.Where(e => e.LoginName.Contains(search.LoginName)); 
      if (search.Status.Length > 0) query = query.Where(e => (search.Status == "Active" && !e.IsLockedOut) 
       || (search.Status == "Inactive" && e.IsLockedOut)); 
      //sorting. 
      query = query.OrderBy(sortColumn, sortDirection); 
      //get total record count. 
      int totalRecordCount = query.Count(); 
      //paging. 
      query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize); 
      //set total record count. 
      var list = query.ToList(); 
      if (list.Count > 0) 
      { 
       list[0].TotalRecordCount = totalRecordCount; //throws exception 
      } 
      //return json. 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      return serializer.Serialize(list); 
     } 

回答

1

你要選擇的原始對象而不是將它們映射到新的對象(無論是相同類型的,或者匿名類型)。

替換此:

var query = from e in db.Employees 
         select new 
         { 
          EmployeeID = e.EmployeeID, 
          FirstName = e.FirstName, 
          LastName = e.LastName, 
          LoginName = e.LoginName, 
          IsLockedOut = e.IsLockedOut, 
          TotalRecordCount = e.TotalRecordCount 
         }; 

有了這個:

var query = db.Employees.AsQueryable(); 

再後來就替換此:

var list = query.ToList(); 
if (list.Count > 0) 
{ 
    list[0].TotalRecordCount = totalRecordCount; 
} 

有了這個:

var list = from e in query 
      select new 
      { 
       EmployeeID = e.EmployeeID, 
       FirstName = e.FirstName, 
       LastName = e.LastName, 
       LoginName = e.LoginName, 
       IsActive = !e.IsLockedOut, 
       TotalRecordCount = totalRecordCount 
      }; 

我認爲這應該是一切。如果JavaScriptSerializer需要List,只要確保你使用這樣的:return serializer.Serialize(list.ToList());

+0

謝謝,但這個不起作用因爲我需要限制我返回的列,以便消息大小更小,同時也因爲當它嘗試抓取所有錯誤(如「字符串必須只是一個字符長」)和循環引用時出錯。 – Justin 2009-06-19 17:36:58

1

我結束了使用自定義視圖類來得到這個工作...

partial class EmployeeView 
    { 
     public int EmployeeID { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string LoginName { get; set; } 
     public bool IsActive { get; set; } 
     public int TotalRecordCount { get; set; } 
    } 

public string GetPageJSON(string sortColumn, string sortDirection, int pageNumber, int pageSize, EmployeeSearch search) 
     { 
      var query = from e in db.Employees 
         select new EmployeeView 
         { 
          EmployeeID = e.EmployeeID, 
          FirstName = e.FirstName, 
          LastName = e.LastName, 
          LoginName = e.LoginName, 
          IsActive = !e.IsLockedOut, 
          TotalRecordCount = 0 
         }; 
      //searching. 
      if (search.FirstName.Length > 0) query = query.Where(e => e.FirstName.Contains(search.FirstName)); 
      if (search.LastName.Length > 0) query = query.Where(e => e.LastName.Contains(search.LastName)); 
      if (search.LoginName.Length > 0) query = query.Where(e => e.LoginName.Contains(search.LoginName)); 
      if (search.Status.Length > 0) query = query.Where(e => (search.Status == "Active" && e.IsActive) 
       || (search.Status == "Inactive" && !e.IsActive)); 
      //sorting. 
      query = query.OrderBy(sortColumn, sortDirection); 
      //get total record count. 
      int totalRecordCount = query.Count(); 
      //paging. 
      query = query.Skip((pageNumber - 1) * pageSize).Take(pageSize); 
      //set total record count. 
      var list = query.ToList(); 
      if (list.Count > 0) 
      { 
       list[0].TotalRecordCount = totalRecordCount; 
      } 
      //return json. 
      JavaScriptSerializer serializer = new JavaScriptSerializer(); 
      return serializer.Serialize(list); 
     }