Требуется функциональность MemberShip.GetAllUsers (startDate, endDate) - PullRequest
0 голосов
/ 20 августа 2009

Я создаю интерфейс одобрения пользователей, используя класс .Net Membership. У меня есть страница, которая выполняет Membership.GetAllUsers (), и я плюю результаты в сетку данных. Я фильтрую их по MembershipUser.IsApproved.

Моя проблема связана с медлительностью, с которой я сталкиваюсь, пока я получаю GetAllUsers ().

Поскольку мне не нужно опускать всех пользователей, а, скажем, всех пользователей с CreateDate, попадающих в определенный диапазон, мне интересно, есть ли способ получить подмножество на основе даты -range

Требуется обновление для тех, кто находится в аналогичной ситуации:


UPDATE: Таким образом, я фактически не использовал ответ ниже .. Хотя, это действительно обращается к определенному вопросу должным образом. В любом случае, моя настоящая проблема заключалась в том, чтобы захватить подмножество пользователей (то есть тех, которые требуют «одобрения» - поскольку мой администратор контролирует это (не пользователи)). Мое решение состояло в том, чтобы назначить новым зарегистрированным пользователям роль «awaitingapproval», после чего я смог получить Roles.UsersInRole («awaitingapproval»), отобразить их администратору с возможностью «одобрить» пользователя. Каждый одобренный пользователь затем удаляется из «awaitingapproval» и назначается на новую роль.

Ответы [ 2 ]

1 голос
/ 20 августа 2009

Несмотря на то, что GetAllUsers () имеет некоторые перегрузки для возврата подмножества пользователей на основе индекса (то есть по одной «странице» пользователей за раз), вы ничего не могли бы использовать, чтобы основывать его на пользовательской логике, подобной этой.

Я бы, вероятно, написал новый класс, который наследует базовый поставщик членства, и добавил бы новую перегрузку для GetAllUsers ().

Вы можете использовать Reflector , чтобы увидеть исходный код для реализации метода GetAllUsers () System.Web.Security.SqlMembershipProvider в качестве отправной точки.

0 голосов
/ 20 августа 2009

Я бы скорее сказал, что вы могли бы использовать Linq для запроса значений, но, как я попробовал, я получаю ошибку.

users.AsQueryable()
-->Exception : source is not source is not IEnumerable

Вместо этого вы можете написать хранимую процедуру, которая получает всех пользователей из базы данных по заданной вами дате создания и переходит от этого результата.
-> Существует элемент, на котором членство автоматически создается в базе данных SQL, просто измените aspnet_Membership_GetAllUsers хранимая процедура по заданным параметрам

SELECT u.UserName, m.Email, m.PasswordQuestion, m.Comment, m.IsApproved,
        m.CreateDate,
        m.LastLoginDate,
        u.LastActivityDate,
        m.LastPasswordChangedDate,
        u.UserId, m.IsLockedOut,
        m.LastLockoutDate
FROM   dbo.aspnet_Membership m, dbo.aspnet_Users u, #PageIndexForUsers p
WHERE  u.UserId = p.UserId AND u.UserId = m.UserId AND
       p.IndexId >= @PageLowerBound AND p.IndexId <= @PageUpperBound AND
       m.CreateDate BETWEEN @pFirstDate AND @pSecondDate //Additional

ORDER BY u.UserName
...