深度加载数据- MVC /实体框架/存储库模式

本文关键字:框架 存储 模式 实体 深度 数据 MVC 加载 | 更新日期: 2023-09-27 18:14:47

我正在实现一个ASP。asp.net MVC 5 web应用。NET Identity 2和Troy Goode的PagedList。我需要在JqGrid中以以下格式显示UserRole数据:


用户名|角色名


这是我的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();
    } 

这个my Controller方法(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);
    } 

我可以的。我不知道应该在哪里以及如何将数据从通过外键链接到我的表(即用户)的表中深度加载。用户名和角色。名称)-你能帮忙吗?

深度加载数据- MVC /实体框架/存储库模式

这只是在实体框架中使用存储库模式是愚蠢想法的众多原因之一。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();
}