#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. Как только я приду в офис завтра утром, я собираюсь попробовать это! Отличный подход.