2017-09-28 56 views
0

我正在处理管理视图,该视图列出了ASP.NET身份用户以及创建新用户的链接。现在,该链接只是带你到一个新的页面,并创建一个新用户的表单。保存新用户后,它会将您发送回用户列表页面。列表页面已经接受pageNumber和pageSize参数(其中pageSize是一次检索和显示的用户数量)。我想要做的是显示包含刚刚创建的用户的页面,但是如何确定哪个页面该用户落在?使用实体框架获取包含特定记录的分页结果

我需要知道该用户在所有用户的集合中的索引,但我不想检索所有用户来执行此操作。有没有办法让Entity Framework从本质上返回Row_Number()呢。我的具体记录?否则,我觉得我只需要创建一个存储过程给我的索引,但我可以用代码优先的身份数据库(我是新的代码优先和身份证)。


编辑: 请求的代码摘录(修改为简洁起见):

public ActionResult Users(int? pageNum, int? pageSize) 
{ 
    ActionResult response; 

    AccountAdminUsersVM vm = new AccountAdminUsersVM(); 
    vm.PageSize = pageSize ?? 50; 
    vm.CurrentPage = pageNum ?? 1; 

    try 
    { 
     int totalCount; 
     vm.UsersPage = GetUsers(vm.CurrentPage, vm.PageSize, out totalCount); 
     vm.TotalCount = totalCount; 

     ... 

     response = View(vm); 
    } 
    catch (Exception ex) 
    { 
     ... 
    } 

    return response; 
} 

private List<ApplicationUser> GetUsers(int page, int pageSize, out int totalCount) 
{ 
    totalCount = UserManager.Users.Count(); 
    return UserManager.Users 
      .OrderBy(u => u.UserName) 
      .Skip((page - 1) * pageSize) 
      .Take(pageSize) 
      .ToList(); 
} 

private ApplicationUserManager UserManager 
{ 
    get 
    { 
     return HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>(); 
    } 
} 

这就是我想象中的SQL需要看起来像(除列的顺序将需要太多参数):

SELECT t1.RowNum 
FROM (
      SELECT Id, ROW_NUMBER() OVER(ORDER BY UserName) AS RowNum 
      FROM AspNetUsers 
     ) t1 
WHERE t1.Id = @Id 

这似乎是Linq的一个高难度订单。

+0

不会将它添加为最后一条记录(或者您是否在分页结果中进行一些排序)? –

+0

他们将按某些财产/专栏排序。目前它是用户名。 – xr280xr

+0

获得'行号'将无济于事。您需要获取排序后集合中新对象的索引 –

回答

0

当您调用context.SaveChanges()/ await AsyncSaveChanges()时,结果将包含新创建的实体。您可以将其传回给您的重定向操作。

编辑:需要ToList()的调用。所以它不会延迟加载,并且如果期望很多应用程序用户,那么这不会是推荐的选项。

//this is how you can get the index of the user in an ordered list. "_newUserName" is being passed in, either as a User object or string (your call) 

var index = UserManager.Users.OrderBy(a=>a.UserName).ToList().Select((user, index) => new {user,index}).Where(a=>a.user.UserName == "_newUserName").Select(a=>a.index).FirstOrDefault(); 

//then determine the page new user sits on 
var page = (index/pageSize) + 1; 
return UserManager.Users 
     .OrderBy(u => u.UserName) 
     .Skip((page - 1) * pageSize) 
     .Take(pageSize) 
     .ToList(); 
+0

然后,如何处理该实体以确定要显示哪个分页页面? – xr280xr

+0

你能否在这里粘贴你的代码,这将帮助我回答你的问题。 –

+0

已添加。 CreateUser操作(未显示)重定向回用户。我的用户行为的结构并非一成不变。我现在只是在混淆身份。 – xr280xr