Лучший способ проверить настройки во всех профилях - PullRequest
1 голос
/ 25 марта 2011

Используя ASP.net, есть ли лучший рекомендуемый способ доступа к определенному полю профиля в коде.Я искал в своей старой книге Problem-Design-Solution 2.0, и она делает это, вытягивая всех членов в БД, а затем перебирая профиль каждого (см. Код ниже).Есть ли лучший способ?

for each (MembershipUser user in Membership.GetAllUsers())
{
    ProfileCommon userProfile = profile.GetProfile(user.UserName);
    if (userProfile.mysetting == desiredValue)
    { 
         //do something
    }
}

Редактировать 1

Я обнаружил, что это можно сделать немного эффективнее, чем вытягивать элементы, а затем вытягивать профили.Возможно, что не у всех участников есть профиль, поэтому, если вы используете следующий код, вы извлечете все профили (которых может быть меньше, чем членов, а затем сможете выполнить итерацию по нему:

for each (ProfileInfo theProfile in ProfileManager.GetAllProfiles (ProfileAuthenticationOption.All)
{
    ProfileCommon pc = ProfileBase.Create(theProfile.UserName)
    if (pc.mysetting == desiredValue)
    {
        //do something
    }
}

Он по-прежнему выполняет обход БД для каждого профиля, но может делать это не так часто, как если бы мы использовали элементы ...

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Со встроенными профилями нет лучшего способа. Один из вариантов, предоставленных Тимом, - это провайдер Table Profile или создание собственного провайдера профилей.

Или вы можете пойти совершенно другим путем, т.е. , сохраняя информацию профиля в своей собственной таблице.

0 голосов
/ 25 марта 2011

Вы можете использовать Поставщик профилей таблиц и создавать пользовательские запросы для получения желаемых настроек.

0 голосов
/ 25 марта 2011

Возможно, вы могли бы добиться большего успеха с linq, у меня сейчас нет VS, но псевдокод будет выглядеть примерно так:

var users = from MembershipUser user in Membership.GetAllUsers()
  where user.mysetting == desiredValue
  select user

итерируйте пользователей,

foreach(MembershipUser u in users) {
// do something
}

, которые должны содержать только те, которые представляют интерес. Linq должен правильно выполнять SQL для вас, но вы можете проверить, что он делает с профилировщиком.


EDIT

На самом деле это, вероятно, не даст вам ничего с точки зрения производительности, GetAllUsers собирается вернуть все. Возможно, вы захотите создать dbml-карту linq2sql для таблицы пользователей и использовать ее вместо класса Membership для запросов к пользовательскому свойству.


РЕДАКТИРОВАТЬ 2

Роли и профили ASP.NET: лучший способ запроса коллекции пользователей, которые соответствуют свойству пользовательского профиля?

Если вы используете поставщика профилей таблицы, вы можете использовать запрос linq для этой таблицы: http://weblogs.asp.net/kencox/archive/2010/09/05/using-the-sql-table-profile-provider-in-asp-net-4-web-applications-c-amp-vb.aspx

...