public static async Task <List <Account> > GetSalesforceAccounts(AuthenticationClient auth) { var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion); // retrieve all accounts var accts = new List <Account>(); var results = await client.QueryAsync <Account>(ACCOUNT_QUERY); var totalSize = results.totalSize; accts.AddRange(results.records); var nextRecordsUrl = results.nextRecordsUrl; if (!string.IsNullOrEmpty(nextRecordsUrl)) { while (true) { var continuationResults = await client.QueryContinuationAsync <Account>(nextRecordsUrl); totalSize = continuationResults.totalSize; accts.AddRange(continuationResults.records); if (string.IsNullOrEmpty(continuationResults.nextRecordsUrl)) { break; } //pass nextRecordsUrl back to client.QueryAsync to request next set of records nextRecordsUrl = continuationResults.nextRecordsUrl; } } return(accts); }
public async Task <List <ExpandoObject> > GetObjectsByQuery(string query) { QueryResult <ExpandoObject> results = await _client.QueryAsync <ExpandoObject>(query); var nextRecordsUrl = results.NextRecordsUrl; var objects = new List <ExpandoObject>(); objects.AddRange(results.Records); if (!string.IsNullOrEmpty(results.NextRecordsUrl)) { while (true) { var continuationResults = await _client.QueryContinuationAsync <ExpandoObject>(nextRecordsUrl); objects.AddRange(continuationResults.Records); nextRecordsUrl = continuationResults.NextRecordsUrl; if (string.IsNullOrEmpty(nextRecordsUrl)) { break; } } } return(objects); }
public async Task Query_Accounts_Continuation() { var accounts = await _client.QueryAsync <Account>("SELECT count() FROM Account"); if (accounts.TotalSize < 1000) { await CreateLotsOfAccounts(_client); } var contacts = await _client.QueryAsync <dynamic>("SELECT Id, Name, Description FROM Account"); var nextRecordsUrl = contacts.NextRecordsUrl; var nextContacts = await _client.QueryContinuationAsync <dynamic>(nextRecordsUrl); Assert.IsNotNull(nextContacts); Assert.AreNotEqual(contacts, nextContacts); }
public async Task <List <T> > QueryRecords <T>(string query) { List <T> recordList = new List <T>(); var recordQuery = await Client.QueryAsync <T>(query); recordList.AddRange(recordQuery.Records); while (!string.IsNullOrEmpty(recordQuery.NextRecordsUrl)) { //add a small delay await Task.Delay(100); recordQuery = await Client.QueryContinuationAsync <T>(recordQuery.NextRecordsUrl); recordList.AddRange(recordQuery.Records); } return(recordList); }
public IEnumerable <T> Get <T>(string query) where T : SystemObject { var typeName = ((DisplayNameAttribute)typeof(T).GetCustomAttribute(typeof(DisplayNameAttribute))).DisplayName; string nextRecordsUrl; global::Salesforce.Common.Models.Json.QueryResult <T> results; try { var qry = string.Empty; if (_jobData.LastCrawlFinishTime > DateTimeOffset.MinValue) { qry = string.Format("SELECT {0} FROM " + query + " WHERE SystemModStamp >= {1}", GetObjectFieldsSelectList(typeName), _jobData.LastCrawlFinishTime.AddDays(-2).ToString("o")); } else { qry = string.Format("SELECT {0} FROM " + query, GetObjectFieldsSelectList(typeName)); //ToDo: Husk at fjerne LIMIT 10, dette er kun til testformål for at begrænse datasættet og dermed performance } results = salesforceClient.QueryAsync <T>(qry).Result; nextRecordsUrl = results.NextRecordsUrl; } catch (Exception ex) { _log.LogError("Could not fetch Salesforce Data", ex); yield break; } foreach (var result in results.Records) { yield return(result); } while (!string.IsNullOrEmpty(nextRecordsUrl)) { try { results = salesforceClient.QueryContinuationAsync <T>(nextRecordsUrl).Result; } catch (Exception ex) { _log.LogError("Could not fetch Salesforce Data", ex); yield break; } foreach (var item in results.Records) { yield return(item); } if (string.IsNullOrEmpty(results.NextRecordsUrl)) { yield break; } //pass nextRecordsUrl back to client.QueryAsync to request next set of records nextRecordsUrl = results.NextRecordsUrl; } }
private static async Task ProcessCases() { // Make the Connection - this is usually absctracted out for apps with many process // and returns the client and exposes a boo if connection is made var auth = new AuthenticationClient(); var url = IsSandBox.Equals("true", StringComparison.CurrentCultureIgnoreCase) ? "https://cs2.salesforce.com/services/oauth2/token" : "https://login.salesforce.com/services/oauth2/token"; await auth.UsernamePasswordAsync(ConsumerKey, ConsumerSecret, UN, PW, url); Console.WriteLine("Connected to SFDC"); var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion); //Now we will get all the cases which are Provision with a status of Requested string soqlQry = "SELECT id FROM case WHERE recordtypeid = '" + CaseRT + "' and status = 'Requested'"; List <SFDC_App.Models.Salesforce.Case> cases = new List <SFDC_App.Models.Salesforce.Case>(); var results = await client.QueryAsync <SFDC_App.Models.Salesforce.Case>(soqlQry); int totalSize = results.TotalSize; Console.WriteLine("Queried " + totalSize + " records"); cases.AddRange(results.Records); var nextRecord = results.NextRecordsUrl; if (!string.IsNullOrEmpty(nextRecord)) { while (true) { var continuationResults = await client.QueryContinuationAsync <SFDC_App.Models.Salesforce.Case>(nextRecord); int NewSize = continuationResults.TotalSize; Console.WriteLine("Queried an additional " + NewSize + " records"); cases.AddRange(continuationResults.Records); if (string.IsNullOrEmpty(continuationResults.NextRecordsUrl)) { break; } nextRecord = continuationResults.NextRecordsUrl; } } }
private static async Task RunSample() { var auth = new AuthenticationClient(); // Authenticate with Salesforce Console.WriteLine("Authenticating with Salesforce"); var url = IsSandboxUser.Equals("true", StringComparison.CurrentCultureIgnoreCase) ? "https://test.salesforce.com/services/oauth2/token" : "https://login.salesforce.com/services/oauth2/token"; await auth.UsernamePasswordAsync(ConsumerKey, ConsumerSecret, Username, Password, url); Console.WriteLine("Connected to Salesforce"); var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion); string sql = "SELECT Id, CaseNumber, Current_Version__c, Priority, Go_Live_Critical__c, Case.Account.name, " + "Case.Owner.name, Origin, Patch_Number__c, Subject, OwnerId, Type, Description, CreatedDate, " + "Case.createdBy.name, status, bzid__c, product__c, Customer__r.name, " + "( SELECT CommentBody, CaseComment.createdBy.name, CaseComment.lastModifiedBy.name, CreatedDate, LastModifiedDate FROM CaseComments ORDER BY CreatedDate DESC NULLS LAST LIMIT 1 ) " + "FROM Case WHERE Status ='Eng New' AND Case.product__c='Accela ACA' AND Case.Owner.name='Engineering'"; //const string qry = "SELECT ID, Name FROM Account"; var accts = new List<Account>(); var results = await client.QueryAsync<Account>(sql); var totalSize = results.TotalSize; Console.WriteLine("Queried " + totalSize + " records."); accts.AddRange(results.Records); var nextRecordsUrl = results.NextRecordsUrl; if (!string.IsNullOrEmpty(nextRecordsUrl)) { Console.WriteLine("Found nextRecordsUrl."); while (true) { var continuationResults = await client.QueryContinuationAsync<Account>(nextRecordsUrl); totalSize = continuationResults.TotalSize; Console.WriteLine("Queried an additional " + totalSize + " records."); accts.AddRange(continuationResults.Records); if (string.IsNullOrEmpty(continuationResults.NextRecordsUrl)) break; //pass nextRecordsUrl back to client.QueryAsync to request next set of records nextRecordsUrl = continuationResults.NextRecordsUrl; } } Console.WriteLine("Retrieved accounts = " + accts.Count() + ", expected size = " + totalSize); // Create a sample record Console.WriteLine("Creating test record."); var account = new Account { Name = "Test Account" }; account.Id = await client.CreateAsync(Account.SObjectTypeName, account); if (account.Id == null) { Console.WriteLine("Failed to create test record."); return; } Console.WriteLine("Successfully created test record."); // Update the sample record // Shows that annonymous types can be used as well Console.WriteLine("Updating test record."); var success = await client.UpdateAsync(Account.SObjectTypeName, account.Id, new { Name = "Test Update" }); if (!string.IsNullOrEmpty(success.Errors.ToString())) { Console.WriteLine("Failed to update test record!"); return; } Console.WriteLine("Successfully updated the record."); // Retrieve the sample record // How to retrieve a single record if the id is known Console.WriteLine("Retrieving the record by ID."); account = await client.QueryByIdAsync<Account>(Account.SObjectTypeName, account.Id); if (account == null) { Console.WriteLine("Failed to retrieve the record by ID!"); return; } Console.WriteLine("Retrieved the record by ID."); // Query for record by name Console.WriteLine("Querying the record by name."); var accounts = await client.QueryAsync<Account>("SELECT ID, Name FROM Account WHERE Name = '" + account.Name + "'"); account = accounts.Records.FirstOrDefault(); if (account == null) { Console.WriteLine("Failed to retrieve account by query!"); return; } Console.WriteLine("Retrieved the record by name."); // Delete account Console.WriteLine("Deleting the record by ID."); var deleted = await client.DeleteAsync(Account.SObjectTypeName, account.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the record by ID."); // Selecting multiple accounts into a dynamic Console.WriteLine("Querying multiple records."); var dynamicAccounts = await client.QueryAsync<dynamic>("SELECT ID, Name FROM Account LIMIT 10"); foreach (dynamic acct in dynamicAccounts.Records) { Console.WriteLine("Account - " + acct.Name); } // Creating parent - child records using a Dynamic Console.WriteLine("Creating a parent record (Account)"); dynamic a = new ExpandoObject(); a.Name = "Account from .Net Toolkit"; a.Id = await client.CreateAsync("Account", a); if (a.Id == null) { Console.WriteLine("Failed to create parent record."); return; } Console.WriteLine("Creating a child record (Contact)"); dynamic c = new ExpandoObject(); c.FirstName = "Joe"; c.LastName = "Blow"; c.AccountId = a.Id; c.Id = await client.CreateAsync("Contact", c); if (c.Id == null) { Console.WriteLine("Failed to create child record."); return; } Console.WriteLine("Deleting parent and child"); // Delete account (also deletes contact) Console.WriteLine("Deleting the Account by Id."); deleted = await client.DeleteAsync(Account.SObjectTypeName, a.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the Account and Contact."); }
private static async Task RunSample() { var auth = new AuthenticationClient(); // Authenticate with Salesforce Console.WriteLine("Authenticating with Salesforce"); var url = IsSandboxUser.Equals("true", StringComparison.CurrentCultureIgnoreCase) ? "https://test.salesforce.com/services/oauth2/token" : "https://login.salesforce.com/services/oauth2/token"; await auth.UsernamePasswordAsync(ConsumerKey, ConsumerSecret, Username, Password, url); Console.WriteLine("Connected to Salesforce"); var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion); // retrieve all accounts Console.WriteLine("Get Accounts"); const string qry = "SELECT ID, Name FROM Account"; var accts = new List <Account>(); var results = await client.QueryAsync <Account>(qry); var totalSize = results.TotalSize; Console.WriteLine("Queried " + totalSize + " records."); accts.AddRange(results.Records); var nextRecordsUrl = results.NextRecordsUrl; if (!string.IsNullOrEmpty(nextRecordsUrl)) { Console.WriteLine("Found nextRecordsUrl."); while (true) { var continuationResults = await client.QueryContinuationAsync <Account>(nextRecordsUrl); totalSize = continuationResults.TotalSize; Console.WriteLine("Queried an additional " + totalSize + " records."); accts.AddRange(continuationResults.Records); if (string.IsNullOrEmpty(continuationResults.NextRecordsUrl)) { break; } //pass nextRecordsUrl back to client.QueryAsync to request next set of records nextRecordsUrl = continuationResults.NextRecordsUrl; } } Console.WriteLine("Retrieved accounts = " + accts.Count() + ", expected size = " + totalSize); // Create a sample record Console.WriteLine("Creating test record."); var account = new Account { Name = "Test Account" }; var createAccountResponse = await client.CreateAsync(Account.SObjectTypeName, account); account.Id = createAccountResponse.Id; if (account.Id == null) { Console.WriteLine("Failed to create test record."); return; } Console.WriteLine("Successfully created test record."); // Update the sample record // Shows that annonymous types can be used as well Console.WriteLine("Updating test record."); var success = await client.UpdateAsync(Account.SObjectTypeName, account.Id, new { Name = "Test Update" }); if (!string.IsNullOrEmpty(success.Errors.ToString())) { Console.WriteLine("Failed to update test record!"); return; } Console.WriteLine("Successfully updated the record."); // Retrieve the sample record // How to retrieve a single record if the id is known Console.WriteLine("Retrieving the record by ID."); account = await client.QueryByIdAsync <Account>(Account.SObjectTypeName, account.Id); if (account == null) { Console.WriteLine("Failed to retrieve the record by ID!"); return; } Console.WriteLine("Retrieved the record by ID."); // Query for record by name Console.WriteLine("Querying the record by name."); var accounts = await client.QueryAsync <Account>("SELECT ID, Name FROM Account WHERE Name = '" + account.Name + "'"); account = accounts.Records.FirstOrDefault(); if (account == null) { Console.WriteLine("Failed to retrieve account by query!"); return; } Console.WriteLine("Retrieved the record by name."); // Delete account Console.WriteLine("Deleting the record by ID."); var deleted = await client.DeleteAsync(Account.SObjectTypeName, account.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the record by ID."); // Selecting multiple accounts into a dynamic Console.WriteLine("Querying multiple records."); var dynamicAccounts = await client.QueryAsync <dynamic>("SELECT ID, Name FROM Account LIMIT 10"); foreach (dynamic acct in dynamicAccounts.Records) { Console.WriteLine("Account - " + acct.Name); } // Creating parent - child records using a Dynamic Console.WriteLine("Creating a parent record (Account)"); dynamic a = new ExpandoObject(); a.Name = "Account from .Net Toolkit"; var createParentAccountResponse = await client.CreateAsync("Account", a); a.Id = createParentAccountResponse.Id; if (a.Id == null) { Console.WriteLine("Failed to create parent record."); return; } Console.WriteLine("Creating a child record (Contact)"); dynamic c = new ExpandoObject(); c.FirstName = "Joe"; c.LastName = "Blow"; c.AccountId = a.Id; var createContactResponse = await client.CreateAsync("Contact", c); c.Id = createContactResponse.Id; if (c.Id == null) { Console.WriteLine("Failed to create child record."); return; } Console.WriteLine("Deleting parent and child"); // Delete account (also deletes contact) Console.WriteLine("Deleting the Account by Id."); deleted = await client.DeleteAsync(Account.SObjectTypeName, a.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the Account and Contact."); }
private static async Task RunSample() { var auth = new AuthenticationClient(); // Authenticate with Salesforce Console.WriteLine("Authenticating with Salesforce"); var url = IsSandboxUser.Equals("true", StringComparison.CurrentCultureIgnoreCase) ? "https://test.salesforce.com/services/oauth2/token" : "https://login.salesforce.com/services/oauth2/token"; await auth.UsernamePasswordAsync(ConsumerKey, ConsumerSecret, Username, Password, url); Console.WriteLine("Connected to Salesforce"); var client = new ForceClient(auth.InstanceUrl, auth.AccessToken, auth.ApiVersion); // retrieve all accounts Console.WriteLine("Get Accounts"); const string qry = "SELECT ID, Name FROM Account"; var accts = new List<Account>(); var results = await client.QueryAsync<Account>(qry); var totalSize = results.TotalSize; Console.WriteLine("Queried " + totalSize + " records."); accts.AddRange(results.Records); var nextRecordsUrl = results.NextRecordsUrl; if (!string.IsNullOrEmpty(nextRecordsUrl)) { Console.WriteLine("Found nextRecordsUrl."); while (true) { var continuationResults = await client.QueryContinuationAsync<Account>(nextRecordsUrl); totalSize = continuationResults.TotalSize; Console.WriteLine("Queried an additional " + totalSize + " records."); accts.AddRange(continuationResults.Records); if (string.IsNullOrEmpty(continuationResults.NextRecordsUrl)) break; //pass nextRecordsUrl back to client.QueryAsync to request next set of records nextRecordsUrl = continuationResults.NextRecordsUrl; } } Console.WriteLine("Retrieved accounts = " + accts.Count() + ", expected size = " + totalSize); // Create a sample record Console.WriteLine("Creating test record."); var account = new Account { Name = "Test Account" }; var response = await client.CreateAsync(Account.SObjectTypeName, account); if (!string.Equals(response.Success, "true", StringComparison.OrdinalIgnoreCase)) { Console.WriteLine("Failed to create test record."); return; } Console.WriteLine("Successfully created test record."); // Update the sample record // Shows that annonymous types can be used as well Console.WriteLine("Updating test record."); var success = await client.UpdateAsync(Account.SObjectTypeName, account.Id, new { Name = "Test Update" }); if (!string.IsNullOrEmpty(success.Errors.ToString())) { Console.WriteLine("Failed to update test record!"); return; } Console.WriteLine("Successfully updated the record."); // Retrieve the sample record // How to retrieve a single record if the id is known Console.WriteLine("Retrieving the record by ID."); account = await client.QueryByIdAsync<Account>(Account.SObjectTypeName, account.Id); if (account == null) { Console.WriteLine("Failed to retrieve the record by ID!"); return; } Console.WriteLine("Retrieved the record by ID."); // Query for record by name Console.WriteLine("Querying the record by name."); var accounts = await client.QueryAsync<Account>("SELECT ID, Name FROM Account WHERE Name = '" + account.Name + "'"); account = accounts.Records.FirstOrDefault(); if (account == null) { Console.WriteLine("Failed to retrieve account by query!"); return; } Console.WriteLine("Retrieved the record by name."); // Delete account Console.WriteLine("Deleting the record by ID."); var deleted = await client.DeleteAsync(Account.SObjectTypeName, account.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the record by ID."); // Selecting multiple accounts into a dynamic Console.WriteLine("Querying multiple records."); var dynamicAccounts = await client.QueryAsync<dynamic>("SELECT ID, Name FROM Account LIMIT 10"); foreach (dynamic acct in dynamicAccounts.Records) { Console.WriteLine("Account - " + acct.Name); } // Creating parent - child records using a Dynamic Console.WriteLine("Creating a parent record (Account)"); dynamic a = new ExpandoObject(); a.Name = "Account from .Net Toolkit"; a.Id = await client.CreateAsync("Account", a); if (a.Id == null) { Console.WriteLine("Failed to create parent record."); return; } Console.WriteLine("Creating a child record (Contact)"); dynamic c = new ExpandoObject(); c.FirstName = "Joe"; c.LastName = "Blow"; c.AccountId = a.Id; c.Id = await client.CreateAsync("Contact", c); if (c.Id == null) { Console.WriteLine("Failed to create child record."); return; } Console.WriteLine("Deleting parent and child"); // Delete account (also deletes contact) Console.WriteLine("Deleting the Account by Id."); deleted = await client.DeleteAsync(Account.SObjectTypeName, a.Id); if (!deleted) { Console.WriteLine("Failed to delete the record by ID!"); return; } Console.WriteLine("Deleted the Account and Contact."); }