public static async Task <bool> xIsInRoleAsync <TContext, TUser, TKey, TUserRole, TRole>(this IIdentityUserRoleStoreWithContext <TContext, TUser, TKey, TUserRole, TRole> store, TUser user, string normalizedRoleName, CancellationToken cancellationToken = default)
            where TContext : class, IIdentityContext//, IIdentityContext_WithUserAndRoles<TKey>
            where TKey : IEquatable <TKey>
            where TUserRole : class, IIdentityUserRole <TKey>
            where TRole : class, IIdentityRole <TKey>
            where TUser : class, IIdentityUserWithRoles <TKey>
        {
            store.ThrowIfCancelledRequestOrDisposedOrUserNull(user, cancellationToken);
            if (string.IsNullOrWhiteSpace(normalizedRoleName))
            {
                throw new ArgumentException(Resources.ValueCannotBeNullOrEmpty, nameof(normalizedRoleName));
            }
            var role = await store.Context.DbGetQueryable <TRole>().xFindByNameAsync(normalizedRoleName, cancellationToken);

            if (role != null)
            {
                var userRole = await store.Context.DbGetQueryable <TUserRole>().xFindAsync(user.Id, role.Id, cancellationToken);

                return(userRole != null);
            }
            return(false);
        }
        public static async Task <IList <string> > xGetRolesAsync <TContext, TUser, TKey, TUserRole, TRole>(this IIdentityUserRoleStoreWithContext <TContext, TUser, TKey, TUserRole, TRole> store, TUser user, CancellationToken cancellationToken = default)
            where TContext : class, IIdentityContext//, IIdentityContext_WithUserAndRoles<TKey>
            where TKey : IEquatable <TKey>
            where TUserRole : class, IIdentityUserRole <TKey>
            where TRole : class, IIdentityRole <TKey>
            where TUser : class, IIdentityUserWithRoles <TKey>
        {
            store.ThrowIfCancelledRequestOrDisposedOrUserNull(user, cancellationToken);
            var userId = user.Id;
            var query  = from userRole in store.Context.DbGetQueryable <TUserRole>()
                         //join role in store.GetRoleQueryable() on userRole.RoleId equals role.Id
                         where userRole.UserId.Equals(userId)
                         select userRole.Role.Name;

            return(await query.xToListAsync(cancellationToken));
        }
        public static async Task <IList <TUser> > xGetUsersInRoleAsync <TContext, TUser, TKey, TUserRole, TRole>(this IIdentityUserRoleStoreWithContext <TContext, TUser, TKey, TUserRole, TRole> store, string normalizedRoleName, CancellationToken cancellationToken = default)
            where TContext : class, IIdentityContext//, IIdentityContext_WithUserAndRoles<TKey>
            where TKey : IEquatable <TKey>
            where TUserRole : class, IIdentityUserRole <TKey>
            where TRole : class, IIdentityRole <TKey>
            where TUser : class, IIdentityUserWithRoles <TKey>
        {
            store.ThrowIfCancelledRequestOrDisposed(cancellationToken);
            if (string.IsNullOrEmpty(normalizedRoleName))
            {
                throw new ArgumentNullException(nameof(normalizedRoleName));
            }
            var role = await store.Context.DbGetQueryable <TRole>().xFindByNameAsync(normalizedRoleName, cancellationToken);

            if (role != null)
            {
                var query = from userrole in store.Context.DbGetQueryable <TUserRole>()
                            //join user in store.GetUserQueryable() on userrole.UserId equals user.Id
                            where userrole.RoleId.Equals(role.Id)
                            select(TUser) userrole.User;
                return(await query.xToListAsync(cancellationToken));
            }
            return(new List <TUser>());
        }
        public static async Task xAddToRoleAsync <TContext, TUser, TKey, TUserRole, TRole>(this IIdentityUserRoleStoreWithContext <TContext, TUser, TKey, TUserRole, TRole> store, TUser user, string normalizedRoleName, CancellationToken cancellationToken = default)
            where TContext : class, IIdentityContext//, IIdentityContext_WithUserAndRoles<TKey>
            where TKey : IEquatable <TKey>
            where TUserRole : class, IIdentityUserRole <TKey>, new()
            where TRole : class, IIdentityRole <TKey>
            where TUser : class, IIdentityUserWithRoles <TKey>
        {
            store.ThrowIfCancelledRequestOrDisposedOrUserNull(user, cancellationToken);
            if (string.IsNullOrWhiteSpace(normalizedRoleName))
            {
                throw new ArgumentException(Resources.ValueCannotBeNullOrEmpty, nameof(normalizedRoleName));
            }
            var roleEntity = await store.Context.DbGetQueryable <TRole>().xFindByNameAsync(normalizedRoleName, cancellationToken);

            if (roleEntity == null)
            {
                throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture, Resources.RoleNotFound, normalizedRoleName));
            }
            await store.Context.DbInsertAsync(user.xCreateUserRole <TKey, TUserRole>(roleEntity));
        }