【问题标题】:Deep loading data - MVC / Entity Framework / Repository Pattern深度加载数据 - MVC / Entity Framework / Repository Pattern
【发布时间】:2014-09-17 17:47:45
【问题描述】:

我正在使用 ASP.NET Identity 2 和 Troy Goode 的 PagedList 实现一个 ASP.NET MVC 5 Web 应用程序。我需要在 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();
    } 

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

我无法弄清楚我应该在哪里以及如何从通过外键链接到我的表的表(即 Users.UserName 和 Roles.Name)中深度加载数据 - 你能帮忙吗?

【问题讨论】:

    标签: c# asp.net-mvc linq entity-framework jqgrid


    【解决方案1】:

    这只是将存储库模式与实体框架结合使用是一个愚蠢想法的众多原因中的另一个。 EF 已经实现了存储库 (DbSet) 和工作单元 (DbContext) 模式。您在这里所做的只是在其周围放置一个 less 功能的包装器。除了咆哮,执行此操作的地方将在您的 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-24
      • 1970-01-01
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多