internal static IObservable <Unit> ExecuteAction(this XafApplication application, string jobId) => Observable.Using(application.CreateNonSecuredObjectSpace, objectSpace => objectSpace.GetObjectsQuery <ExecuteActionJob>().Where(actionJob => actionJob.Id == jobId).ToArray().ToNowObservable() .ConcatIgnored(job => { if (job.AuthenticateUserCriteria == null) { return(job.ReturnObservable()); } var user = objectSpace.FindObject(SecuritySystem.UserType, CriteriaOperator.Parse(job.AuthenticateUserCriteria)); return(user != null ? application.LogonUser(objectSpace.GetKeyValue(user)).FirstAsync().To(job) : Observable.Throw <Job>(new Exception($"{nameof(user)} not found"))); }) .SelectMany(job => application.CreateView(job, application.Model.Views[job.View.Name]).ToUnit() .Merge(application.ExecuteAction(job))) .ToUnit());