Поставщик членства ASP.NET не может вернуть роли пользователя в запросе LINQ - PullRequest
0 голосов
/ 23 сентября 2018

Я пытаюсь получить список всех пользователей с их ролями, используя LINQ.Приложение основано на Provider Membership 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) не работает как класс У ролей нет метода GetRolesForUser ()

Roles available methods

Я даже не могу сделать свой запрос, используя UsersInRoles, так как эта таблица не отображается, как вы можете видеть ниже.Entity Data Model

1 Ответ

0 голосов
/ 24 сентября 2018

Я очень давно видел, как я знаю, когда вы хотите получить данные, используя 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();

С Awaitable :

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();

Когда GetRolesForUser был Async или MultyTask, когдаваша база Query хочет выполнить, и вы не использовали ключ await, исключение произошло, потому что EF не может установить другое соединение в одном Query

...