Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 如何将users表正确连接到Membership表,或者您是否应该这样做?_Linq_Asp.net Mvc 3_Asp.net Membership_Roles - Fatal编程技术网

Linq 如何将users表正确连接到Membership表,或者您是否应该这样做?

Linq 如何将users表正确连接到Membership表,或者您是否应该这样做?,linq,asp.net-mvc-3,asp.net-membership,roles,Linq,Asp.net Mvc 3,Asp.net Membership,Roles,我可能走错了方向,请随时纠正我 目前我有一个名为U_User的用户模型,它包含地址、接收通知、HasCompanyCar等字段 这些用户在.NET成员资格表中具有角色。当用户通过Membership登录时,我在我的数据库中获得他们的用户记录,如下所示(Membership表上的用户名和我自己的U_用户表将匹配): 如果我想获得“创建”角色中所有用户的列表,那么我会这样做: allUsers.Where(x => Roles.IsUserInRole(x.UserName, "Create"

我可能走错了方向,请随时纠正我

目前我有一个名为U_User的用户模型,它包含地址、接收通知、HasCompanyCar等字段

这些用户在.NET成员资格表中具有角色。当用户通过Membership登录时,我在我的数据库中获得他们的用户记录,如下所示(Membership表上的用户名和我自己的U_用户表将匹配):

如果我想获得“创建”角色中所有用户的列表,那么我会这样做:

allUsers.Where(x => Roles.IsUserInRole(x.UserName, "Create"))
这是一个巨大的性能打击,因为它正在为用户的每个迭代进行查找。这让我觉得我没有以正确的方式进行用户管理。因此,要回答这个问题:

如何正确地将成员资格连接到用户表,而用户表又连接到其余数据?我也会接受如何更有效地去做

非常感谢:)

编辑:

我通过下面的代码提高了性能。我一下子就得到了角色中的用户,然后对他们进行过滤

String[] usersInRole = Roles.GetUsersInRole("CanApprove");
users = users.Where(x => usersInRole.Any(y => y == x.UserName));

但我仍然相当肯定我在这件事上完全错了

我们已经为所有AspNet成员资格表创建了EntityFramework实体,这让我们可以像查询任何其他实体一样查询它们


不确定这是否是您所追求的,但可能会有帮助

不是这方面的专家,但我的应用程序通常会使用一个外键(带索引),从我自己的用户表到成员资格用户表,使用具有成员资格的Guid字段。这样我就可以使用Linq进行查询,比如:

 var query = from myUser in MyUsers
            join aspUser in aspnet_Users on myUser.UserId equals aspUser.UserId
            join usersInRole in aspnet_UsersInRoles on aspUser.UserId equals usersInRole.UserId
            join role in aspnet_Roles on usersInRole.RoleId equals role.RoleId
            where role ...
            select new { ... };
(或者您可以使用点形式,如
myUser.AspUser.Roles.Role
,让ORM生成联接(如果您愿意的话)

为了提高性能,偶尔观察SQL跟踪是很好的——确保代码中的每个逻辑步骤没有进行太多SQL往返

希望这有点帮助


更新-在回答您关于“您是否应该这样做”的问题时,我认为“是”,但还有其他可用选项-例如,您可以使用
Profile
字段-请参阅本精彩演练中的步骤6-

 var query = from myUser in MyUsers
            join aspUser in aspnet_Users on myUser.UserId equals aspUser.UserId
            join usersInRole in aspnet_UsersInRoles on aspUser.UserId equals usersInRole.UserId
            join role in aspnet_Roles on usersInRole.RoleId equals role.RoleId
            where role ...
            select new { ... };