2015-09-27 5 views
0

Чтобы облегчить некоторые вещи, я создал базовый класс для пользовательского «управления». Это не то же самое, что управление учетными записями, которое уже предоставлено.Linq - Исключает пользователей из списка в выражении IQueryable - Каков правильный путь?

Это мой базовый класс:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using Microsoft.AspNet.Identity.EntityFramework; 

namespace ARSoftwareV2.UserLibrary 
{ 
    // This is a base class for all user needs. If you want to implement your own set of checks, 
    // you can simply inherit from this class and you get pretty much everything you need already set up. 
    public class UserClassBase 
    { 
     private Models.ApplicationDbContext DefaultContextInstance; 
     // We only want to show the "final results" here, not what should be hidden. 
     protected Models.ApplicationDbContext CreateNewContext() 
     { 
      return new Models.ApplicationDbContext(); 
     } 

     protected Models.ApplicationDbContext DefaultContext 
     { 
      get 
      { 
       if (DefaultContextInstance == null) 
       { 
        DefaultContextInstance = CreateNewContext(); 
       } 
       return DefaultContextInstance; 
      } 
     } 
     // This lists users based on a number of criteria. 
     // Called without arguments, the query lists all users which are: 
     // - Enabled 
     // - Not deleted 
     // - Not employees (this isn't done yet) 
     public IQueryable<Models.ApplicationUser> GetUserListQuery(bool IncludeDisabled = false, bool IncludeDeleted = false,bool IncludeEmployees = false) 
     { 
      IQueryable<Models.ApplicationUser> result; 
      using (DefaultContext) 
      { 
       IQueryable<Models.ApplicationUser> UserQueryIncludeAll = (from user in DefaultContext.Users select user); 
       result = UserQueryIncludeAll; 
       if (!(IncludeEmployees == true)) 
       { 
        // I need to make a join here to exclude employees by the user list. 
       } 
       if ((IncludeDisabled == false) && (IncludeDeleted == false)) 
       { 
        result.Where(u => u.Enabled == true && u.Deleted == false); 
       } 
       else if (IncludeDisabled == true) 
       { 
        result.Where(u => u.Deleted == true); 
       } 
       else if (IncludeDeleted == true) 
       { 
        result.Where(u => u.Enabled == true); 
       } 
      } 
      return result; 
     } 

     public bool UserEmailExists(string EmailToCheck) 
     { 
      IQueryable<Models.ApplicationUser> Query = GetUserListQuery().Where(u => u.Email == EmailToCheck && u.Roles.Contains(); 
      IList<Models.ApplicationUser> resultList = Query.ToList<Models.ApplicationUser>(); 
      return (resultList.Count >0); 
     } 

     public Models.ApplicationUser FindUserByID(string ID) 
     { 
      IQueryable<Models.ApplicationUser> Query = GetUserListQuery().Where(u => u.Id == ID); 
      Models.ApplicationUser result = Query.FirstOrDefault(); 
      return result; 
     } 

     public string[] UserRoles(string UserID) 
     { 
      Models.ApplicationUser User; 
      User = FindUserByID(UserID); 
      IList<string> result = new List<string>; 
      foreach(var r in User.Roles) 
      { 
       result.Add(r.ToString()); 
      } 
      return result.ToArray<string>(); 
     } 
    } 
} 

Идея заключается в том, что я могу затем использовать его как от регистрации/авторизации инфраструктуры и из веб-службы.
Итак, проблема заключается в том, что - если сотрудники должны быть исключены - мне нужен способ определить роль. Это, я думаю, должно быть сделано через соединение. Если вы не знаете лучшего способа сделать это, конечно :)

Sooo, мой вопрос: какой лучший способ исключить пользователей, имеющих роль сотрудника? Если, как я думаю, это должно быть объединение, можете ли вы предложить синтаксис, который работает для моего дела? Я гугл и VS2015, похоже, вознамерились маркировками любой попытки с волнистой красной меткой :)

До сих пор я пытался следующим образом:

if (!(IncludeEmployees == true)) 
       { 
        // I need to make a join here to exclude employees by the user list. 
        result.Join(DefaultContext.Roles, r => Roles, Users => Users, Users.ID = r.UserID); 
       } 

И я также попробовал этот путь:

if (!(IncludeEmployees == true)) 
       { 
        innerResult = (from u in UserQueryIncludeAll select u).Join(DefaultContext.Roles, r => Roles, u.Id = r.UserID); 
       } 

Рассматривая подобные вопросы, есть ответ, который подразумевает, что для этого нужно несколько контекстов. Это верно?

Не могли бы вы указать мне, что я делаю неправильно?

+0

Вы не можете использовать флаг 'IsEmployee' в своем классе Entity и использовать его для фильтрации? – vortex

+0

В вашем классе User должно быть какое-либо свойство навигации, например 'Role', чтобы вы могли легко получить доступ к роли, подобной этой' user.Role'. Вы должны показать свои модели 'User' и' Role' для лучшего понимания их, чтобы мы могли легко создавать запрос. Если нет какого-либо навигационного свойства, это означает, что вы пытаетесь сделать его более сложным (потерять преимущество использования EF). – Hopeless

+0

Привет! Я использую все материалы по умолчанию, которые поставляются с VS 2015 CE, и используя тип проекта MVC по умолчанию. Итак, все по сути является дефолтом, за исключением моих настроек! :) –

ответ

1

Используйте навигационные свойства вместо ручного соединения, как этот

result = result.Where(user => !user.Roles.Any(role => role.Id == "Employee")); 

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

public IQueryable<Models.ApplicationUser> GetUserListQuery(bool IncludeDisabled = false, bool IncludeDeleted = false, bool IncludeEmployees = false) 
{ 
    IQueryable<Models.ApplicationUser> result = DefaultContext.Users; 
    if (!IncludeDisabled) 
     result = result.Where(user => user.Enabled); 
    if (!IncludeDeleted) 
     result = result.Where(user => !user.Deleted); 
    if (!IncludeEmployees) 
     result = result.Where(user => !user.Roles.Any(role => role.Id == "Employee")); 
    return result; 
} 
+0

Ничего себе! Это, безусловно, выглядит аккуратно! Я отправлю его немедленно. Поскольку вы хорошо выглядите в этом материале, я уверен, что вы правы, поэтому я соглашусь с этим. Благодаря! –

+0

О, и спасибо, что указали, что мне не хватает заданий! Из всех примеров никто не дал понять, что требуется повторное назначение! –

 Смежные вопросы

  • Нет связанных вопросов^_^