public class UsersPrivilegesDataManager
{
public Dictionary LoadPrivileges(User user)
{
const string methodName = CLASS_NAME + ":" + "LoadPrivileges";
m_User = user;
m_log.InfoFormat("{0} . Start to load the privileges ", methodName);
var userPrivileges = LoadNimUsersWithPrivilegesToPlaybackPortal();
CreateUserPrivilegesObjects(userPrivileges);
ResolvePrivileges(userPrivileges);
m_OriginalUserEntity = ConvertUserPrivilegesToUserEntity(userPrivileges);
m_log.DebugFormat("{0} . Leaving the method with {1} number of user privileges", methodName, userPrivileges.Count);
return userPrivileges;
}
private Dictionary LoadNimUsersWithPrivilegesToPlaybackPortal()
{
const string methodName = CLASS_NAME + ":" + "LoadNIMUsersWithPrivilegesToPlaybackPortal";
m_log.DebugFormat("{0} . Start to load the list of users who have access to the playback portal", methodName);
var playbackPortalAdministratorsIDs = new List();
var playbackPortaNotTenantUserIDs = new List();
var users = new Dictionary();
//Call the query service to get all the privileges
m_log.DebugFormat("{0} . Calling the query service in order to get users who have privileges to the playback portal", methodName);
string error;
var userDataSet = m_queryServiceClient.GetWebPortalNPGroupAndUserData(out error);
var isBusinessUser = m_User.IsBusinessUser
&& !m_User.IsSuperUser
&& !m_User.IsWebPortalAdministrator;
//m_log.DebugFormat("{0} . m_User.IsBusinessUser: {1}. m_User.IsSuperUser: {2}. m_User.IsWebPortalAdministrator: {3}. isBusinessUser: {4} ",methodName
// m_User.IsBusinessUser, m_User.IsSuperUser, m_User.IsWebPortalAdministrator, isBusinessUser, );
int tenantID = 0;
int tenantIdFotBussinessTenant=0;
int userId;
bool isTenant = false;
if (m_User.IsBusinessUser)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
userId = int.Parse(row["iUserID"].ToString());
tenantID = int.Parse(row["iTenantID"].ToString());
//find the tenantId for Business Tenant user
if ((userId == m_User.UserId) && (tenantID != -1))
{
tenantIdFotBussinessTenant = tenantID;
isTenant = true;
}
}
}
if (userDataSet != null && userDataSet.Tables.Count > 0)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
var isPlaybackPortalAdministrator = false;
userId = int.Parse(row["iUserID"].ToString());
tenantID = int.Parse(row["iTenantID"].ToString());
//Handle playback portal administrators / business users
var privilegeId = int.Parse(row["iPrivilegeId"].ToString());
m_log.DebugFormat("{0} . Calling the query service in order to get users who have privileges to the playback portal", methodName);
if (privilegeId == 2 ||
(isBusinessUser && privilegeId == 3))
{
isPlaybackPortalAdministrator = true;
}
//Add the user to the list
if (!users.ContainsKey(userId))
{
users.Add(userId, new UserPrivileges
{
UserId = int.Parse(row["iUserId"].ToString()),
UserName = row["FormattedName"].ToString(),
NPSiteId = int.Parse(row["iSiteId"].ToString()),
LoginName = row["nvcLoginName"].ToString(),
OSLogin = row["nvcOsLogin"].ToString(),
ITenantID = int.Parse(row["iTenantID"].ToString())
});
m_log.InfoFormat("{0} . Adding User ID {1} UserName {2} NPSiteID {3} Is Admin {4} LoginName {5} OSLogin {6} Tenant ID {7}",
methodName,
int.Parse(row["iUserId"].ToString()),
row["FormattedName"],
int.Parse(row["iSiteId"].ToString()),
isPlaybackPortalAdministrator,
row["nvcLoginName"],
row["nvcOsLogin"],
int.Parse(row["iTenantID"].ToString()));
}
if (isTenant == true)
{
//remove all users without tenantID
if ((tenantID != tenantIdFotBussinessTenant)&& (users.ContainsKey(userId)))
{
playbackPortaNotTenantUserIDs.Add(userId);
}
}
//Manage the list of playback portal administrators
if (users.ContainsKey(userId))
{
if (isPlaybackPortalAdministrator)
{
playbackPortalAdministratorsIDs.Add(userId);
}
}
}
}
//Remove the administrators from this list since they have privileges to the entire playback portal
foreach (int administrator in playbackPortalAdministratorsIDs)
{
m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's playback portal administrator or business user", methodName, administrator);
users.Remove(administrator);
}
foreach (var notTenantUserID in playbackPortaNotTenantUserIDs)
{
m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's not tenant", methodName, notTenantUserID);
users.Remove(notTenantUserID);
}
m_log.DebugFormat("{0} . Leaving the method", methodName);
return users;
}
private void CreateUserPrivilegesObjects(Dictionary users)
{
const string methodName = CLASS_NAME + ":" + "CreateUserPrivilegesObjects";
m_log.DebugFormat("{0} . Start to create the UserPrivileges object according to the permissions the user have", methodName);
//Foreach user from the users who have privilegs to playback portal
foreach (KeyValuePair user in users)
{
foreach (LegacySitePrivileges sitePrivilege in m_legacySites)
{
int legacySitePrivId = sitePrivilege.DbId;
if (!users[user.Key].Permissions.ContainsKey(legacySitePrivId))
{
users[user.Key].Permissions.Add(legacySitePrivId, new LegacySitePrivileges
{
DBAdminConnectionString = string.Empty,//sitePrivilege.DBAdminConnectionString,
Version = sitePrivilege.Version,
DbName = sitePrivilege.DbName,
DbId = sitePrivilege.DbId
});
}
foreach (KeyValuePair permissions in sitePrivilege.Permissions)
{
bool isApprove = user.Value.IsPlaybackPortalAdministrator;
legacySitePrivId = sitePrivilege.DbId;
if (!users[user.Key].Permissions[legacySitePrivId].Permissions.ContainsKey(permissions.Value.ResourceId))
{
users[user.Key].Permissions[legacySitePrivId].Permissions.Add(permissions.Value.ResourceId, new PrivilegesResource
{
DisplayValue = permissions.Value.DisplayValue,
Description = permissions.Value.Description,
ResourceId = permissions.Value.ResourceId,
IsApproved = isApprove
});
}
}
m_log.DebugFormat("{0}. Created {1} User Objects for LegacySite.Count = {2} ", methodName,users.Count,m_legacySites.Count);
}
}
m_log.DebugFormat("{0} . Leaving the method", methodName);
}
private void ResolvePrivileges(Dictionary users)
{
const string methodName = CLASS_NAME + ":" + "ResolvePrivileges";
m_log.DebugFormat("{0} . Load the playback portal privileges each user have", methodName);
//Call the query service in order to get the list of users and their permissions to the playback portal
m_log.DebugFormat("{0} . Calling the query service in order to get the list of users and their permissions to the playback portal", methodName);
string error;
DataSet userDataSet = m_queryServiceClient.GetWebPortalUserConfiguration(out error);
//Go over the results
if (userDataSet != null && userDataSet.Tables.Count > 0)
{
foreach (DataRow row in userDataSet.Tables[0].Rows)
{
int userId = int.Parse(row["iUserID"].ToString());
if (users.ContainsKey(userId))
{
int dbID = int.Parse(row["iDbID"].ToString());
int resourceId = int.Parse(row["iResourceID"].ToString());
LegacySitePrivileges outLegacySitePrivileges;
if (users[userId].Permissions.TryGetValue(dbID, out outLegacySitePrivileges))
{
PrivilegesResource outPrivilegesResource;
if (outLegacySitePrivileges.Permissions.TryGetValue(resourceId, out outPrivilegesResource))
{
outPrivilegesResource.IsApproved = true;
m_log.DebugFormat("{0} . Adding Permission to User ID {1}. Resource ID {2}",
methodName,
userId,
resourceId);
}
}
else
{
m_log.WarnFormat("{0} . no legacySiteId:{1} for user Id{2}", methodName, dbID, userId);
}
}
else
{
m_log.DebugFormat("{0} . User ID {1} doesn't exits in the list of users that have permissions to the playback portal. He's permissions won't be added",methodName, userId);
}
}
}
m_log.DebugFormat("{0} . Leaving the method ", methodName);
}
private List ConvertUserPrivilegesToUserEntity(Dictionary updatedUsersPrivilegs)
{
const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity";
m_log.DebugFormat("{0} . Convert the user privileges into the user entity object in order to save it in the DB", methodName);
var usersEntity = new List();
//Foreach user from the user privileges list
foreach (KeyValuePair user in updatedUsersPrivilegs)
{
//Make sure we're not working on Playback portal administrator
if (!user.Value.IsPlaybackPortalAdministrator)
{
var per = new List();
//For each site
foreach (var legacySite in user.Value.Permissions.Values)
{
var permissions = new List
();
if (legacySite.Permissions != null && legacySite.Permissions.Count > 0)
{
var permissionList = legacySite.Permissions.Values;
foreach (var permission in permissionList)
{
if (permission.IsApproved)
{
permissions.Add((Permissions) permission.ResourceId);
}
}
}
var sitePermissions = new SitePermissions
{
DbName = legacySite.DbName,
DbId = legacySite.DbId,
Permissions = permissions.ToArray()
};
per.Add(sitePermissions);
m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}",
methodName,
user.Key,
sitePermissions.DbId,
legacySite.DbName,
legacySite.Version == PBPVersion.Nim
? "Nim" : legacySite.Version == PBPVersion.NicePerform
? "Np" : "Cls");
}
var userEntity = new UserEntity{
UserId = user.Value.UserId,
UserName = user.Value.UserName,
NpSiteId = user.Value.NPSiteId,
IsFullAccessToAllLegacyDatabases = user.Value.IsPlaybackPortalAdministrator,
SitePermissions = per.ToArray()
};
usersEntity.Add(userEntity);
m_log.Debug(string.Format("{0} . {1}",methodName,PrintUserEntity(userEntity)));
}
}
m_log.DebugFormat("{0} . Leaving the method", methodName);
return usersEntity;
}
private List ConvertUserPrivilegesToUserEntityForSite(int dbId, Dictionary updatedUsersPrivilegs, List usersWithGroups, List usersWithoutGroups)
{
const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity";
m_log.DebugFormat("{0} . Convert the user privileges into the user entity object in order to save it in the DB", methodName);
var usersEntity = new List();
//Foreach user from the user privileges list
foreach (KeyValuePair user in updatedUsersPrivilegs)
{
//Make sure we're not working on Playback portal administrator
if (!user.Value.IsPlaybackPortalAdministrator)
{
var per = new List();
var canSeeTabResourceId = (int) Permissions.CanSeeTab;
var legacySite = user.Value.Permissions.FirstOrDefault().Value;
var permissionList = legacySite.Permissions;
var permissions = (from permission
in permissionList.Values.Where(p => p.ResourceId != canSeeTabResourceId)
where permission.IsApproved
select (Permissions) permission.ResourceId).ToList();
legacySite = user.Value.Permissions[dbId];
permissionList = legacySite.Permissions;
var originalCanSeeTab = permissionList.ContainsKey(canSeeTabResourceId)
&& permissionList[canSeeTabResourceId].IsApproved;
var toAssignCanSeeTab = (originalCanSeeTab && !usersWithoutGroups.Contains(user.Key))
|| usersWithGroups.Contains(user.Key);
if (toAssignCanSeeTab)
{
permissions.Add(Permissions.CanSeeTab);
}
SitePermissions sitePermissions = new SitePermissions
{
DbId = legacySite.DbId,
Permissions = permissions.ToArray()
};
per.Add(sitePermissions);
m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}",
methodName,
user.Key,
sitePermissions.DbId,
legacySite.DbName,
legacySite.Version == PBPVersion.Nim
? "Nim" : legacySite.Version == PBPVersion.NicePerform
? "Np" : "Cls");
var userEntity = new UserEntity
{
UserId = user.Value.UserId,
UserName = user.Value.UserName,
NpSiteId = user.Value.NPSiteId,
IsFullAccessToAllLegacyDatabases = user.Value.IsPlaybackPortalAdministrator,
SitePermissions = per.ToArray()
};
usersEntity.Add(userEntity);
m_log.Debug(string.Format("{0} . {1}", methodName, PrintUserEntity(userEntity)));
}
}
m_log.DebugFormat("{0} . Leaving the method", methodName);
return usersEntity;
}
#endregion
}
В настоящее время у нас около 5000+ пользователей и существует 5 миллионов записей привилегий. Метод ResolvePrivileges() обрабатывает 5 миллионов записей, и его выполнение заняло около 6000 мс. Я попытался преломить этот метод в своем цикле Parrallel.Foreach, но его выполнение заняло около 4500 мс. Я попытался объединить все 3 метода LoadNimUsersWithPrivilegesToPlaybackPortal(), CreateUserPrivilegesObjects(), ResolvePrivileges() в процедуру хранилища, но есть 2 системы, размещенные на разных сервер, поэтому это невозможно, поскольку это единственный способ добраться до него с помощью WCF, поэтому этот вариант также невозможен. Только ResolvePrivileges() напрямую имеет дело с базой данных, находящейся под моим контролем. Я подумываю о преобразовании Dictionalty "Dictionalusers" в json или xml и пытаюсь работать из процедуры хранилища. Если можете, предложите идею получше.
Я работаю над задачей оптимизации кода. Ниже приведен подробный код
[code]public class UserPrivileges { #region Properties
public int UserId { get; set; } public int NPSiteId { get; set; } public string UserName{ get; set; } public bool IsPlaybackPortalAdministrator { get; set; } public Dictionary Permissions { get; set; } public string LoginName { get; set; } public string OSLogin { get; set; } public int ITenantID { get; set; }
#endregion
#region Constructor
public UserPrivileges() { IsPlaybackPortalAdministrator = false; Permissions = new Dictionary(); }
#endregion
#region Override Methods
public override string ToString() { StringBuilder sb = new StringBuilder();
sb.AppendLine(string.Format("User ID {0}, User Name {1} , NPSiteId {2}, Is Playback Portal Administrator {3}", UserId, UserName, 0, IsPlaybackPortalAdministrator));
if (Permissions.Count > 0) { foreach (KeyValuePair permission in Permissions) { if (permission.Value != null) { int dbId = permission.Value.DbId; string dbName = permission.Value.DbName;
//Permissions if (permission.Value.Permissions != null) { foreach (KeyValuePair per in permission.Value.Permissions) { if (per.Value.IsApproved) { sb.AppendLine(string.Format("DB Id {0} DB Name {1} " + "- Permission Id {2} - Permission Value to display {3}", dbId,dbName, per.Value.ResourceId, per.Value.DisplayValue)); } } } } } } else { sb.AppendLine("No Permissions"); }
return sb.ToString();
}
public string UsersPrivilegesToolTip { get { // User Login name and OS login return string.Format("Login Name: {0}{1}OS Login: {2}", LoginName, Environment.NewLine, OSLogin); } } #endregion
public void CopyPrivileges(Dictionary privileges) { foreach(KeyValuePair privilegeToCopy in privileges) { //Permissions foreach (KeyValuePair perm in privilegeToCopy.Value.Permissions) { Permissions[privilegeToCopy.Key].Permissions[perm.Key].IsApproved = perm.Value.IsApproved; } } } }
public class LegacySitePrivileges { #region Properties
public string DbName { get; set; } public int DbId { get; set; }
public PBPVersion Version { get; set; }
public string DBAdminConnectionString { get; set; }
public Dictionary Permissions { get; set; }
#endregion
#region Constructor
public LegacySitePrivileges() { Permissions = new Dictionary(); }
#endregion
public override string ToString() { return string.Format("DB Name {0} DB ID {1}", DbName, DbId); } }
public class PrivilegesResource { #region Properties public int ResourceId{ get; set; } public string DisplayValue { get; set; } public string Description { get; set; } public bool IsApproved { get; set; } #endregion }
public class PrivilegesResourcePermission : PrivilegesResource { #region Constructor public PrivilegesResourcePermission() { IsApproved = false; } #endregion }
public class LegacySitePrivilegesId { public int DBId { get; set; } public int OriginalSiteId { get; set; }
public LegacySitePrivilegesId(int dbId, int siteId) { DBId = dbId; OriginalSiteId = siteId; }
public override string ToString(){ return DBId + "_" + OriginalSiteId; } } [/code] Ниже приведены затронутые методы
пространство имен WebPortal.Client.Entities {
[code]public class UsersPrivilegesDataManager {
public Dictionary LoadPrivileges(User user) { const string methodName = CLASS_NAME + ":" + "LoadPrivileges"; m_User = user; m_log.InfoFormat("{0} . Start to load the privileges ", methodName); var userPrivileges = LoadNimUsersWithPrivilegesToPlaybackPortal(); CreateUserPrivilegesObjects(userPrivileges); ResolvePrivileges(userPrivileges); m_OriginalUserEntity = ConvertUserPrivilegesToUserEntity(userPrivileges); m_log.DebugFormat("{0} . Leaving the method with {1} number of user privileges", methodName, userPrivileges.Count); return userPrivileges; }
private Dictionary LoadNimUsersWithPrivilegesToPlaybackPortal() { const string methodName = CLASS_NAME + ":" + "LoadNIMUsersWithPrivilegesToPlaybackPortal"; m_log.DebugFormat("{0} . Start to load the list of users who have access to the playback portal", methodName);
var playbackPortalAdministratorsIDs = new List(); var playbackPortaNotTenantUserIDs = new List(); var users = new Dictionary();
//Call the query service to get all the privileges m_log.DebugFormat("{0} . Calling the query service in order to get users who have privileges to the playback portal", methodName); string error; var userDataSet = m_queryServiceClient.GetWebPortalNPGroupAndUserData(out error); var isBusinessUser = m_User.IsBusinessUser && !m_User.IsSuperUser && !m_User.IsWebPortalAdministrator;
int tenantID = 0; int tenantIdFotBussinessTenant=0; int userId; bool isTenant = false;
if (m_User.IsBusinessUser) { foreach (DataRow row in userDataSet.Tables[0].Rows) { userId = int.Parse(row["iUserID"].ToString()); tenantID = int.Parse(row["iTenantID"].ToString()); //find the tenantId for Business Tenant user if ((userId == m_User.UserId) && (tenantID != -1)) { tenantIdFotBussinessTenant = tenantID; isTenant = true; } } }
if (userDataSet != null && userDataSet.Tables.Count > 0) { foreach (DataRow row in userDataSet.Tables[0].Rows) { var isPlaybackPortalAdministrator = false; userId = int.Parse(row["iUserID"].ToString()); tenantID = int.Parse(row["iTenantID"].ToString());
//Handle playback portal administrators / business users var privilegeId = int.Parse(row["iPrivilegeId"].ToString());
m_log.DebugFormat("{0} . Calling the query service in order to get users who have privileges to the playback portal", methodName); if (privilegeId == 2 || (isBusinessUser && privilegeId == 3)) { isPlaybackPortalAdministrator = true; }
//Add the user to the list if (!users.ContainsKey(userId)) { users.Add(userId, new UserPrivileges { UserId = int.Parse(row["iUserId"].ToString()), UserName = row["FormattedName"].ToString(), NPSiteId = int.Parse(row["iSiteId"].ToString()), LoginName = row["nvcLoginName"].ToString(), OSLogin = row["nvcOsLogin"].ToString(), ITenantID = int.Parse(row["iTenantID"].ToString())
}); m_log.InfoFormat("{0} . Adding User ID {1} UserName {2} NPSiteID {3} Is Admin {4} LoginName {5} OSLogin {6} Tenant ID {7}", methodName, int.Parse(row["iUserId"].ToString()), row["FormattedName"], int.Parse(row["iSiteId"].ToString()), isPlaybackPortalAdministrator, row["nvcLoginName"], row["nvcOsLogin"], int.Parse(row["iTenantID"].ToString())); } if (isTenant == true) { //remove all users without tenantID if ((tenantID != tenantIdFotBussinessTenant)&& (users.ContainsKey(userId))) { playbackPortaNotTenantUserIDs.Add(userId); } }
//Manage the list of playback portal administrators if (users.ContainsKey(userId)) { if (isPlaybackPortalAdministrator) { playbackPortalAdministratorsIDs.Add(userId); } } } }
//Remove the administrators from this list since they have privileges to the entire playback portal foreach (int administrator in playbackPortalAdministratorsIDs) { m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's playback portal administrator or business user", methodName, administrator); users.Remove(administrator); }
foreach (var notTenantUserID in playbackPortaNotTenantUserIDs) { m_log.DebugFormat("{0} . Removing the User ID {1} from the list of users since he's not tenant", methodName, notTenantUserID); users.Remove(notTenantUserID); } m_log.DebugFormat("{0} . Leaving the method", methodName);
return users; }
private void CreateUserPrivilegesObjects(Dictionary users) { const string methodName = CLASS_NAME + ":" + "CreateUserPrivilegesObjects"; m_log.DebugFormat("{0} . Start to create the UserPrivileges object according to the permissions the user have", methodName);
//Foreach user from the users who have privilegs to playback portal foreach (KeyValuePair user in users) { foreach (LegacySitePrivileges sitePrivilege in m_legacySites) {
int legacySitePrivId = sitePrivilege.DbId; if (!users[user.Key].Permissions.ContainsKey(legacySitePrivId)) { users[user.Key].Permissions.Add(legacySitePrivId, new LegacySitePrivileges { DBAdminConnectionString = string.Empty,//sitePrivilege.DBAdminConnectionString, Version = sitePrivilege.Version, DbName = sitePrivilege.DbName, DbId = sitePrivilege.DbId }); }
foreach (KeyValuePair permissions in sitePrivilege.Permissions) { bool isApprove = user.Value.IsPlaybackPortalAdministrator;
m_log.DebugFormat("{0}. Created {1} User Objects for LegacySite.Count = {2} ", methodName,users.Count,m_legacySites.Count); } }
m_log.DebugFormat("{0} . Leaving the method", methodName); }
private void ResolvePrivileges(Dictionary users) { const string methodName = CLASS_NAME + ":" + "ResolvePrivileges"; m_log.DebugFormat("{0} . Load the playback portal privileges each user have", methodName); //Call the query service in order to get the list of users and their permissions to the playback portal m_log.DebugFormat("{0} . Calling the query service in order to get the list of users and their permissions to the playback portal", methodName); string error; DataSet userDataSet = m_queryServiceClient.GetWebPortalUserConfiguration(out error);
//Go over the results if (userDataSet != null && userDataSet.Tables.Count > 0) { foreach (DataRow row in userDataSet.Tables[0].Rows) { int userId = int.Parse(row["iUserID"].ToString()); if (users.ContainsKey(userId)) { int dbID = int.Parse(row["iDbID"].ToString()); int resourceId = int.Parse(row["iResourceID"].ToString());
LegacySitePrivileges outLegacySitePrivileges;
if (users[userId].Permissions.TryGetValue(dbID, out outLegacySitePrivileges)) { PrivilegesResource outPrivilegesResource;
if (outLegacySitePrivileges.Permissions.TryGetValue(resourceId, out outPrivilegesResource)) { outPrivilegesResource.IsApproved = true; m_log.DebugFormat("{0} . Adding Permission to User ID {1}. Resource ID {2}", methodName, userId, resourceId); } } else { m_log.WarnFormat("{0} . no legacySiteId:{1} for user Id{2}", methodName, dbID, userId); } } else { m_log.DebugFormat("{0} . User ID {1} doesn't exits in the list of users that have permissions to the playback portal. He's permissions won't be added",methodName, userId); }
} } m_log.DebugFormat("{0} . Leaving the method ", methodName); }
private List ConvertUserPrivilegesToUserEntity(Dictionary updatedUsersPrivilegs) { const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity"; m_log.DebugFormat("{0} . Convert the user privileges into the user entity object in order to save it in the DB", methodName);
var usersEntity = new List();
//Foreach user from the user privileges list foreach (KeyValuePair user in updatedUsersPrivilegs) { //Make sure we're not working on Playback portal administrator if (!user.Value.IsPlaybackPortalAdministrator) { var per = new List(); //For each site foreach (var legacySite in user.Value.Permissions.Values) { var permissions = new List ();
if (legacySite.Permissions != null && legacySite.Permissions.Count > 0) { var permissionList = legacySite.Permissions.Values;
foreach (var permission in permissionList) { if (permission.IsApproved) { permissions.Add((Permissions) permission.ResourceId); } } }
var sitePermissions = new SitePermissions { DbName = legacySite.DbName, DbId = legacySite.DbId, Permissions = permissions.ToArray() };
per.Add(sitePermissions);
m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}", methodName, user.Key, sitePermissions.DbId, legacySite.DbName, legacySite.Version == PBPVersion.Nim ? "Nim" : legacySite.Version == PBPVersion.NicePerform ? "Np" : "Cls"); }
m_log.DebugFormat("{0} . Leaving the method", methodName); return usersEntity; }
private List ConvertUserPrivilegesToUserEntityForSite(int dbId, Dictionary updatedUsersPrivilegs, List usersWithGroups, List usersWithoutGroups) { const string methodName = CLASS_NAME + ":" + "ConvertUserPrivilegesToUserEntity"; m_log.DebugFormat("{0} . Convert the user privileges into the user entity object in order to save it in the DB", methodName);
var usersEntity = new List();
//Foreach user from the user privileges list foreach (KeyValuePair user in updatedUsersPrivilegs) { //Make sure we're not working on Playback portal administrator if (!user.Value.IsPlaybackPortalAdministrator) { var per = new List(); var canSeeTabResourceId = (int) Permissions.CanSeeTab; var legacySite = user.Value.Permissions.FirstOrDefault().Value; var permissionList = legacySite.Permissions; var permissions = (from permission in permissionList.Values.Where(p => p.ResourceId != canSeeTabResourceId) where permission.IsApproved select (Permissions) permission.ResourceId).ToList();
per.Add(sitePermissions); m_log.InfoFormat("{0} . Adding site permission to User ID {1} Site ID {2} Site Name {3} Version {4}", methodName, user.Key, sitePermissions.DbId, legacySite.DbName, legacySite.Version == PBPVersion.Nim ? "Nim" : legacySite.Version == PBPVersion.NicePerform ? "Np" : "Cls");
m_log.DebugFormat("{0} . Leaving the method", methodName); return usersEntity; }
#endregion } [/code]
В настоящее время у нас около 5000+ пользователей и существует 5 миллионов записей привилегий. Метод ResolvePrivileges() обрабатывает 5 миллионов записей, и его выполнение заняло около 6000 мс. Я попытался преломить этот метод в своем цикле Parrallel.Foreach, но его выполнение заняло около 4500 мс. Я попытался объединить все 3 метода LoadNimUsersWithPrivilegesToPlaybackPortal(), CreateUserPrivilegesObjects(), ResolvePrivileges() в процедуру хранилища, но есть 2 системы, размещенные на разных сервер, поэтому это невозможно, поскольку это единственный способ добраться до него с помощью WCF, поэтому этот вариант также невозможен. Только ResolvePrivileges() напрямую имеет дело с базой данных, находящейся под моим контролем. Я подумываю о преобразовании Dictionalty "Dictionalusers" в json или xml и пытаюсь работать из процедуры хранилища. Если можете, предложите идею получше.
Меня это немного озадачило, поскольку я ожидал (это просто показывает, насколько удивительной может быть производительность!), что результаты при 20 потоках и 100 потоках будут очень похожими, а 20, во всяком случае, будут незначительно отличаться....
Как подойти к разработке приведенного ниже приложения?
Поэтому я хочу создать простое приложение Counter, но загвоздка в том, что вместо того, чтобы пользователь каждый раз вручную нажимал кнопку, чтобы увеличить граф. Я хочу добавить опцию записи:...
У меня есть пример приложения ниже, использующий сложное свойство в EF Core. При запросе базы данных Customer Rider дает мне ложноположительное предложение включить свойство Address.
Однако при попытке включить адрес, как предложено, это приводит к...
В C# можно «предложить», какая функция Type A использует общая функция, используя ее вручную, вместо того, чтобы позволить компилятору угадать ее из контекста. Vscode.
причина в том, что у меня есть функция поиска, которая возвращает tkinter.widget...