Как выполнить запрос «ИЛИ» с разъемом S4S? - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь выяснить, как запросить Salesforce с несколькими фильтрами, где любой фильтр может быть истинным (аналогично традиционному оператору WHERE x='' OR y='' SQL).

Похоже, что работает следующее, но создает запрос 'И', где оба фильтра должны быть истинными:

var dataSource = new GenericSalesforceEntityDataSource("Download__c", GetSalesforceSession);
dataSource.AddDataSourceFilter("Contact__c", new Operator(ComparisonOperator.Equals), profile.ContactId);
dataSource.AddDataSourceFilter("Lead__c", new Operator(ComparisonOperator.Equals), profile.LeadId);
var downloads = dataSource.GetQueryResultsAsEntities();

Я бы хотел избежать жесткого кодирования запросов SOQL в мое приложение .NET,если возможно.Поддерживает ли API-интерфейс S4S такие запросы или я должен использовать для этого SOQL?

Ответы [ 2 ]

2 голосов
/ 16 августа 2012

Sitecore для Salesforce Connector (S4S) имеет составные фильтры, которые позволяют программно создавать источник данных, который преобразуется в запрос SOQL с операторами OR в предложении where.

var dataSource = new GenericSalesforceEntityDataSource("Download__c", GetSalesforceSession);
var orFilter = new LogicalDisjunctionFilter();
orFilter.AddDataSourceFilter("Contact__c", ComparisonOperator.Equals, profile.ContactId);
orFilter.AddDataSourceFilter(ApexLog.Fields.Location, ComparisonOperator.Equals, "SystemLog");
// The two filters above will be combined with a logical OR
dataSource.AddDataSourceFilter(orFilter);
var downloads = dataSource.GetQueryResultsAsEntities();

Вы можете использовать комбинации LogicalDisjunctionFilter с LogicalConjunctionFilter для создания логики И и ИЛИ при необходимости.

В качестве альтернативы, вы можете напрямую добавить условие SOQL where к источнику данных.

var dataSource = new GenericSalesforceEntityDataSource("Download__c", GetSalesforceSession);
dataSource.SoqlFilter = string.Format("Contact__c = '{0}' OR Location = 'SystemLog'", profile.ContactId);
var downloads = dataSource.GetQueryResultsAsEntities();

Или, как предполагает Мэтт, вы можете создать свою собственную строку SOQL и запустить ее напрямую.

var dataSource = new GenericSalesforceEntityDataSource("Download__c", GetSalesforceSession);
var queryResult = dataSource.RunSoqlQuery(new SoqlQuery(string.Format("Select Id from Download__c where Contact__c = '{0}' OR Location = 'SystemLog'", profile.ContactId)));
var downloads = dataSource.EntitysFromQueryResult<GenericSalesforceEntity>(queryResult);
1 голос
/ 10 января 2012

SOQL сделает это намного проще, так что это будет выбранный вами маршрут, если он вам доступен, тем более что он предлагает самый простой способ выполнения логических операций с вашими фильтрами.

...