我正在使用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);
}
我无法弄清楚我应该从通过外键链接到我的表(I.E. Users.UserName和Roles.Name)的表中深度加载数据的位置和方式 - 你能帮忙吗?
答案 0 :(得分:2)
这只是为什么将存储库模式与Entity Framework一起使用是一个愚蠢的想法的众多原因中的另一个。 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();
}