2014-07-25 50 views
0

我正在實現ASP.NET MVC 5 Web應用程序使用ASP.NET身份2和特洛伊古德的PagedList。我需要在JqGrid中以下列格式顯示UserRole數據:深度加載數據 - MVC /實體框架/庫模式


用戶名|角色名稱


這是我的UserRole類:

public class UserRole : Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole<int> 
{ 
    [ForeignKey("UserId")] 
    public virtual User User { get; set; } 

    [ForeignKey("RoleId")] 
    public virtual Role Role { get; set; } 
} 

這是我的倉庫方法

public virtual IQueryable<UserRole> GetAsQueryable(Expression<Func<UserRole, bool>> where) 
    { 
     return _dataContext.UserRoles.Where(where).AsQueryable(); 
    } 

這是我的控制器方法(GetAsPagedList方法簡單地下令將輸入表,適用PagedList的.ToPagedList方法並返回它的一個子集):

 public ActionResult GridData(MvcJqGrid.GridSettings gridSettings) 
     { 
     IQueryable<UserRole> items = _repository.GetAsQueryable(); 

     IPagedList<T> pagedOrderedItems = PagingHelper<UserRole>.GetAsPagedList(
      items, 
      gridSettings.SortOrder, gridSettings.SortColumn, 
      gridSettings.PageIndex, gridSettings.PageSize); 

     var jsonData = new 
     { 
      total = pagedOrderedItems.TotalItemCount/gridSettings.PageSize + 1, 
      page = gridSettings.PageIndex, 
      records = pagedOrderedItems.TotalItemCount, 
      rows = (
       from c in pagedOrderedItems 
       select new 
       { 
        id = c.UserId + '-' + c.RoleId, 
        cell = new[] 
        { 
         "Edit", 
         "Details", 
         // TODO: something like this: 
         // [UserName] = c.User.UserName 
         // [RoleName] = c.Role.Name 
         c.Role.Name 
        } 
       }).ToArray() 
     }; 

     return Json(jsonData, JsonRequestBehavior.AllowGet); 
    } 

我不能弄清楚我應該在哪裏以及如何從通過外鍵鏈接到我的表格的表格中加載數據(I.E. Users.UserName和Roles.Name) - 你能幫忙嗎?

回答

2

這只是爲什麼在Entity Framework中使用存儲庫模式是一個愚蠢的想法的另一個原因。 EF已經實施知識庫(DbSet)和工作單元(DbContext)模式。所有你在這裏做的是圍繞它的包裝功能。撇開,做這個的地方應該在你的GetAsQueryable方法上。您可以添加一個附加參數以接受要包含的一系列屬性,然後使用該參數在您的方法中調用Include

public virtual IQueryable<UserRole> GetAsQueryable(Expression<Func<UserRole, bool>> where, string includeProperties = null) 
{ 
    IQueryable<UserRole> query = _dataContext.UserRoles.Where(where); 

    if (includeProperties != null) 
    { 
     foreach (var includeProperty in includeProperties.Split 
      (new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) 
     { 
      query = query.Include(includeProperty); 
     } 
    } 
    return query.AsQueryable(); 
}