【问题标题】:Get paged result containing specific record with Entity Framework使用实体框架获取包含特定记录的分页结果
【发布时间】:2018-03-09 14:32:25
【问题描述】:

我正在开发一个管理视图,该视图列出了 ASP.NET 身份用户以及用于创建新用户的链接。现在,该链接只是将您带到一个带有用于创建新用户的表单的新页面。保存新用户后,它会将您送回用户列表页面。列表页面已经接受 pageNumber 和 pageSize 参数(其中 pageSize 是一次检索和显示的用户数。)我想要做的是显示包含刚刚创建的用户的页面,但是我如何确定哪个页面那个用户落在?

我需要知道该用户在所有用户集中的索引,但我不想检索所有用户来执行此操作。有没有办法让实体框架基本上返回 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 来说似乎是一项艰巨的任务。

【问题讨论】:

  • 不会作为最后一条记录添加(或者您是否在分页结果中进行一些排序)?
  • 它们将按某些属性/列排序。目前是用户名。
  • 获取“行号”无济于事。需要获取排序集合中新对象的索引

标签: c# asp.net sql-server entity-framework pagination


【解决方案1】:

当您调用 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();

【讨论】:

  • 然后我该如何处理该实体来确定要显示哪个分页页面?
  • 你能把你的代码贴在这里,这将有助于我回答你的问题。
  • 已添加。 CreateUser 操作(未显示)重定向回用户。我的用户操作的结构并不是一成不变的。我现在有点在搞身份。
  • 刚刚编辑了我的答案以显示如何获取新用户的索引,它是基于pageSize的相应页面。希望对您有所帮助。
  • 如此接近!我收到这个异常,听起来好像无法将其转换为 SQL?:LINQ to Entities 无法识别方法 'System.Linq.IQueryable1[&lt;&gt;f__AnonymousType12[TLGI.CRM.MVCWeb.Models.ApplicationUser,System.Int32]]选择[ApplicationUser,f__AnonymousType12](System.Linq.IQueryable1[TLGI.CRM.MVCWeb.Models.ApplicationUser], System.Linq.Expressions.Expression1[System.Func3[TLGI.CRM.MVCWeb.Models.ApplicationUser,System.Int32,f__AnonymousType1`2[TLGI.CRM.MVCWeb.Models.ApplicationUser,System.Int32]]])' 方法,该方法不能翻译成store表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-12
  • 2021-08-24
  • 2012-01-05
  • 1970-01-01
相关资源
最近更新 更多