public override IList <User> GetAccessibleItemUsers(Access access) { using (var transaction = new TransactionScope(_configuration)) { if (access.AllUsers) { var userStore = new UserDataStore(transaction); return(userStore.FindAll(_applicationName)); } if (access.AllPersonTypes && access.AllSites) { var userStore = new UserDataStore(transaction); return(userStore.FindAll(_applicationName)); } if (access.UserId != null) { var userStore = new UserDataStore(transaction); var singleUserList = new List <User>(); singleUserList.Add(userStore.FindByName(_applicationName, access.UserId)); return(singleUserList); } if (access.AllPersonTypes && access.SiteId != null) { var store = new PersonSiteDataStore(transaction); IList <PersonSite> people = store.FindPersonsBySite(access.SiteId, false); var userList = new List <User>(); var userStore = new UserDataStore(transaction); foreach (PersonSite person in people) { userList.Add(userStore.FindByPerson(_applicationName, person.Person.Id)); } return(userList); } if (access.AllSites && access.PersonTypeId != null) { var store = new PersonPersonTypeDataStore(transaction); IList <PersonPersonType> people = store.FindPersonByPersonType(access.PersonTypeId); var userList = new List <User>(); var userStore = new UserDataStore(transaction); foreach (PersonPersonType person in people) { userList.Add(userStore.FindByPerson(_applicationName, person.Person.Id)); } return(userList); } if (access.SiteId != null && access.PersonTypeId != null) { var userInPersonTypeStore = new PersonPersonTypeDataStore(transaction); IList <PersonPersonType> personInPersonType = userInPersonTypeStore.FindPersonByPersonType(access.PersonTypeId); var userInSiteStore = new PersonSiteDataStore(transaction); IList <PersonSite> userInSites = userInSiteStore.FindPersonsBySite(access.SiteId, false); //convert to a generic list to perform better search var userInSitesList = new List <PersonSite>(userInSites); var usersInBoth = new List <User>(); var userStore = new UserDataStore(transaction); foreach (PersonPersonType personPersonType in personInPersonType) { if ( userInSitesList.Exists( delegate(PersonSite ul) { return(ul.Person.Id == personPersonType.Person.Id); })) { usersInBoth.Add(userStore.FindByName(_applicationName, personPersonType.Person.Id)); } } return(usersInBoth); } return(new List <User>()); } }