1

我们正在为我们的 ASP.NET MVC 3 应用程序编写一个自定义管理页面,我们对从 aspnet“应用程序服务”数据库中获取用户所需的时间感到惊讶。

内置的 Membership.GetAllUsers() 方法非常缓慢,但可以理解,因为它为每个用户获取大量信息。我们不需要那么多,所以我们决定在我们的 aspnet 数据库之上添加一个 LINQ to SQL 层,并使用 LINQ 编写我们自己的查询。我们没有获取所有内容,而是获取了几列——我们唯一感兴趣的列。  

结果更好,但仍然:使用标准方法获取 120 多位用户大约需要 30 秒,而使用我们的自定义查询需要 9 秒。

150 行 9 秒似乎很大。知道为什么需要这么长时间吗?

编辑这是一个需要 9 秒才能返回内容的方法示例:

    public static List<LightMembershipUser> GetUsersInRole(string roleName) {
        //Find the role
        var roleId =   (from role in db.Roles
                        where roleName == role.RoleName
                        select role.RoleId)
                        .First();
        if (roleId==null){ return null; }

        var res =   from u in db.Users 
                    join ur in db.UsersInRoles on u.UserId equals ur.UserId
                    join m in db.Memberships on u.UserId equals m.UserId
                    where  ur.RoleId==roleId
                    select new LightMembershipUser { UserName = u.UserName, CreationDate = m.CreateDate, Email = m.Email, Roles = Roles.GetRolesForUser(u.UserName) };
        return res.ToList();
    }
4

2 回答 2

1

没有什么特定于会员系统会导致访问缓慢的情况,而且您在 30 秒内拥有 120 个用户也不应该是典型的情况。成员资格只是数据库中的一组表,除非您以这种方式设置,否则它们甚至不是一个单独的数据库。它们只是行。

您的数据库服务器显然有问题。即使在慢速服务器上,您也应该能够在微秒内返回 150 行。不过,您可以尝试在您的问题中包含您的查询,因为这可能是您做错了。

等等..你在做 150 次查询吗?还是一个查询返回 150 条记录?显然,Membership API 无法同时返回多个用户,因此如果您使用 Membership,则必须执行 150 次查询才能获得 150 个用户。但是您自己的查询应该能够处理任意数量的行。

于 2012-04-15T21:26:43.790 回答
-1

我建议您根本不要使用 aspnet 数据库,而是创建自己的数据库和MembershipProvider扩展RoleProvider.

你能提供你的查询吗?

于 2012-04-15T19:08:13.247 回答