2014-07-25 47 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(); 
}