Фильтрация пользовательской таблицы по MembershipUserCollection

#asp.net-mvc-3 #entity-framework-4

#asp.net-mvc-3 #entity-framework-4

Вопрос:

Итак, в моем приложении настроено членство в ASP. У меня также есть отдельная таблица пользователей для управления данными, не связанными с членством. Во время управления пользователями мне нужно убедиться, что мое приложение запрашивает обе таблицы. У меня есть приведенный ниже контроллер, который возвращает список утвержденных пользователей, но, похоже, для этого должен быть более простой способ. Какой лучший способ сделать это?

         QuoteExchangeDB _db = new QuoteExchangeDB();

        [MyAuthorize(Roles = "Administrator")]
        public ActionResult Admin()
        {
            MembershipUserCollection agents = Membership.GetAllUsers();
            IEnumerable<MembershipUser> unfiltered = agents.Cast<MembershipUser>();
            var filtered = unfiltered.Where(u => u.IsApproved);
            List<User> users = new List<User>();
            foreach (var item in filtered)
            {
                if (item.IsApproved)
                {
                    Guid guid = (Guid)item.ProviderUserKey;
                    users.Add(_db.Users.Single(u => u.MembershipGuid.Equals(guid)));
                }
            }
            return View(users);
        }
  

Комментарии:

1. Ваш if (item.IsApproved) блок кажется избыточным, учитывая, что вы уже фильтруете для этого.

2. Лол… Я выполнил инструкцию if до того, как добавил инструкцию Linq… Я даже этого не уловил. Исправлено сейчас.

Ответ №1:

Похоже, вам, вероятно, нужно простое объединение в LINQ.

 var filtered = Membership.GetAllUsers().Cast<MembershipUser>().Where(u => u.IsApproved);

var users = from f in filtered
        join u in _db.Users on ((Guid)f.ProviderUserKey) equals u.MembershipGuid
        select u;
  

Вероятно, вы могли бы сделать одно утверждение из этого даже:

 var users = from f in Membership.GetAllUsers().Cast<MembershipUser>()
    join u in _db.Users on ((Guid)f.ProviderUserKey) equals u.MembershipGuid
    where f.IsApproved
    select u;
  

Редактировать: Учитывая, что я не уверен, как объединение IEnumerable с IQueryable может повлиять на ситуацию / вызвать проблемы в этом случае, вот блог об этом.

Комментарии:

1. Как только я приду в офис завтра утром, я собираюсь попробовать это! Отличный подход.