//Low-level methods public ILogin FindLogin(IEntitySession session, string userName, string password, Guid?tenantId) { var context = session.Context; context.ValidateNotEmpty(userName, ClientFaultCodes.ValueMissing, "UserName", null, "UserName may not be empty"); context.ValidateNotEmpty(password, ClientFaultCodes.ValueMissing, "Password", null, "Password may not be empty"); context.ThrowValidation(); userName = CheckUserName(context, userName); var userNameHash = _hashService.ComputeHash(userName); var tenantIdValue = tenantId == null ? Guid.Empty : tenantId.Value; var qryLogins = from lg in session.EntitySet <ILogin>() where lg.UserNameHash == userNameHash && lg.UserName == userName select lg; // Match password using (session.WithElevatedRead()) { var login = qryLogins.FirstOrDefault(); return(login); } }