ASP.NET成员资格提供程序无法在LINQ查询中返回用户角色

时间:2018-09-23 07:50:54

标签: c# asp.net linq asp.net-membership

我正在尝试使用LINQ获取所有具有其角色的用户的列表。 该应用程序基于会员资格提供者ver.1,我想从下面的配置行中可以看到:

<membership defaultProvider="DefaultMembershipProvider">
  <providers>
    <add name="DefaultMembershipProvider" type="System.Web.Providers.DefaultMembershipProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionStringName="DefaultConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="2" applicationName="/" />
  </providers>
</membership>
<roleManager enabled="true" defaultProvider="DefaultRoleProvider">
  <providers>
    <add connectionStringName="DefaultConnection" applicationName="/" name="DefaultRoleProvider" type="System.Web.Providers.DefaultRoleProvider, System.Web.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </providers>
</roleManager>

我的LINQ查询是这样的:

var users = (from u in db.Users
            join m in db.Memberships on u.UserId equals m.UserId
            select new 
            {
               m.Email,
               u.UserName,
               u.UserId,
               m.IsLockedOut,
               Roles = Roles.GetRolesForUser(u.UserName) //doesn't work   
             }).ToList();

问题在于Roles = Roles.GetRolesForUser(u.UserName)不能作为类 Roles没有任何方法GetRolesForUser()

Roles available methods

我什至无法使用UsersInRoles进​​行查询,因为未映射此表,如下所示。 Entity Data Model

1 个答案:

答案 0 :(得分:2)

之前我已经知道,当您想使用LINQ来获取数据并使用另一个LINQ时,它是行不通的。

解决此问题的最佳方法是,必须在Roles之前获取所有Query(当数据保存在内存中时,可以轻松获得这些数据)或使该方法Awaitable像这样:

有记忆力

var allRoles = _roleMaganer.GetAllRoles();

var users = (from u in db.Users
        join m in db.Memberships on u.UserId equals m.UserId
        select new 
        {
           m.Email,
           u.UserName,
           u.UserId,
           m.IsLockedOut,
           Roles = allRoles.FirstOrDefault(x=>x.UserName == u.UserName)    
         }).ToList();

等待中

var users = (from u in db.Users
        join m in db.Memberships on u.UserId equals m.UserId
        select new 
        {
           m.Email,
           u.UserName,
           u.UserId,
           m.IsLockedOut,
           Roles = await Roles.GetRolesForUser(u.UserName)   
         }).ToList();
  

GetRolesForUserAsyncMultyTask时,如果您的基础Query要执行,而您没有使用await键,则会发生异常,因为EF无法在一个Query

中建立其他连接