如何使用S4S连接器执行“OR”查询?

时间:2012-01-10 00:49:28

标签: salesforce sitecore

我正在尝试弄清楚如何使用多个过滤器查询Salesforce,其中任一过滤器都可以为true(类似于传统的WHERE x='' OR y='' SQL语句)。

以下内容似乎有效,但会生成' AND'查询两个过滤器必须为true的位置:

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应用程序中。 S4S API是否支持这些类型的查询,或者我应该使用SOQL吗?

2 个答案:

答案 0 :(得分:2)

Sitecore for Salesforce Connector (S4S)具有复合过滤器,允许您以编程方式创建在where子句中使用OR运算符转换为SOQL查询的DataSource。

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的组合来根据需要构建AND和OR逻辑。

或者,您可以直接将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();

或者,正如Matt建议的那样,您可以构建自己的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 :(得分:1)

SOQL会使这更加容易,因此应该是您选择的路径,特别是因为它提供了使用过滤器执行逻辑操作的最简单方法。