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

C# 深度加载数据-MVC/实体框架/存储库模式,c#,asp.net-mvc,linq,entity-framework,jqgrid,C#,Asp.net Mvc,Linq,Entity Framework,Jqgrid,我正在使用ASP.NET Identity 2和Troy Goode实现一个ASP.NET MVC 5 web应用程序。我需要在JqGrid中以以下格式显示UserRole数据: 用户名|角色名 这是我的UserRole类: public class UserRole : Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole<int> { [ForeignKey("UserId")] public v

我正在使用ASP.NET Identity 2和Troy Goode实现一个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类用户角色:Microsoft.AspNet.Identity.EntityFramework.IdentityUserRole
{
[外键(“用户ID”)]
公共虚拟用户用户{get;set;}
[外国钥匙(“RoleId”)]
公共虚拟角色{get;set;}
}
这是我的存储库方法

public virtual IQueryable<UserRole> GetAsQueryable(Expression<Func<UserRole, bool>> where)
    {
        return _dataContext.UserRoles.Where(where).AsQueryable();
    } 
公共虚拟IQueryable GetAsQueryable(表达式,其中)
{
返回_dataContext.UserRoles.Where(Where).AsQueryable();
} 
此my Controller方法(GetAsPagedList方法仅对输入列表进行排序,将PagedList的.ToPagedList方法应用于该列表并返回其子集):

public ActionResult GridData(MvcJqGrid.GridSettings GridSettings)
{
IQueryable items=\u repository.GetAsQueryable();
IPagedList pagedOrderedItems=PaginHelper.GetAsPagedList(
项目,
gridSettings.SortOrder、gridSettings.SortColumn、,
gridSettings.PageIndex、gridSettings.PageSize);
var jsonData=new
{
total=pagedOrderedItems.TotalItemCount/gridSettings.PageSize+1,
page=gridSettings.PageIndex,
记录=pagedOrderedItems.TotalItemCount,
行=(
从pagedOrderedItems中的c
选择新的
{
id=c.UserId+'-'+c.RoleId,
单元格=新[]
{
“编辑”,
“详情”,
//TODO:类似这样的内容:
//[UserName]=c.User.UserName
//[RoleName]=c.Role.Name
c、 角色名称
}
}).ToArray()
};
返回Json(jsonData、JsonRequestBehavior.AllowGet);
} 

我不知道应该在哪里以及如何将通过外键链接的表中的数据深度加载到我的表(即Users.UserName和Roles.Name)-请您提供帮助

这只是将存储库模式与实体框架结合使用是一个愚蠢想法的众多原因中的另一个。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();
}
公共虚拟IQueryable GetAsQueryable(表达式,其中,字符串includeProperties=null) { IQueryable query=\u dataContext.UserRoles.Where(Where); if(includeProperties!=null) { foreach(includeProperty.Split中的var includeProperty (新字符[]{',},StringSplitOptions.RemoveEmptyEntries) { query=query.Include(includeProperty); } } 返回query.AsQueryable(); }
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();
}