Вы не можете напрямую получать записи об участниках деятельности, но вы можете использовать их в LinkEntities:
private bool contactHasResponded(Guid idCampaign, Guid idContact)
{
QueryExpression qryCampaignResponses = new QueryExpression("campaignresponse");
qryCampaignResponses.ColumnSet = new AllColumns();
qryCampaignResponses.Criteria = new FilterExpression();
qryCampaignResponses.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, idCampaign);
LinkEntity leContact = new LinkEntity("campaignresponse", "activityparty", "activityid", "activityid", JoinOperator.Inner);
leContact.LinkCriteria = new FilterExpression();
leContact.LinkCriteria.AddCondition("partyid", ConditionOperator.Equal, idContact);
qryCampaignResponses.LinkEntities.Add(leContact);
List<gcCampaignresponse> lstCampaignResponses = gcCampaignresponse.RetrieveMultiple(m_svcCrm, qryCampaignResponses);
return (lstCampaignResponses.Count > 0);
}
Это скажет вам, есть ли ответ кампании для данной кампании и контакта. (Я использую классы сущностей, сгенерированные Stunnware Tools, поэтому вызов RetrieveMultiple выглядит немного иначе, но я думаю, вы поняли мою точку зрения).
Если вы перевернете эту конструкцию QueryExpression / LinkEntity вверх ногами, вы также можете получить все контакты, которые откликнулись на данную кампанию (вы также можете ограничить это контактами в определенном маркетинговом списке с помощью второго LinkEntity).
Единственное, что невозможно сделать напрямую с одним запросом, - это «отрицательный» чек, который вы ищете, поэтому вам придется взять этот результат и выполнить «внешнее объединение» со своим маркетинговым списком, чтобы получить контакты, которые не ответил.