Чтобы облегчить некоторые вещи, я создал базовый класс для пользовательского «управления». Это не то же самое, что управление учетными записями, которое уже предоставлено.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);
}
Рассматривая подобные вопросы, есть ответ, который подразумевает, что для этого нужно несколько контекстов. Это верно?
Не могли бы вы указать мне, что я делаю неправильно?
Вы не можете использовать флаг 'IsEmployee' в своем классе Entity и использовать его для фильтрации? – vortex
В вашем классе User должно быть какое-либо свойство навигации, например 'Role', чтобы вы могли легко получить доступ к роли, подобной этой' user.Role'. Вы должны показать свои модели 'User' и' Role' для лучшего понимания их, чтобы мы могли легко создавать запрос. Если нет какого-либо навигационного свойства, это означает, что вы пытаетесь сделать его более сложным (потерять преимущество использования EF). – Hopeless
Привет! Я использую все материалы по умолчанию, которые поставляются с VS 2015 CE, и используя тип проекта MVC по умолчанию. Итак, все по сути является дефолтом, за исключением моих настроек! :) –