public IObservable <Unit> Login(string username, string password) { var credentials = Observable.Return(new Credentials(username, password)); var dbCheck = credentials.SelectMany(cred => { if (String.IsNullOrEmpty(cred.Username) || String.IsNullOrEmpty(cred.Password)) { return(Observable.Throw <User>(new ArgumentException(FileLanguage.Error_EmptyUsernameOrPassword))); } foreach (var user in from u in UserDatabase.Users where u.Username == cred.Username select u) { if (user.Password == cred.Password) { return(Observable.Return <User>(user)); } else { return(Observable.Throw <User>(new ArgumentException(FileLanguage.BAD_LOGIN))); } } return(Transport.CheckUser(cred.Username, cred.Password) .ObserveOnDispatcher() .Select(_ => CreateUser(username, password))); }); return(dbCheck.ObserveOnDispatcher() .Do(user => { LoggedUser = user; App.Engine.StatisticsManager.LogUserLogin(_loggedUser); }) .Select(_ => new Unit())); }