我正在使用CRM版本9.0,我希望通过C#删除CRM中具有相同ID的所有记录。
我想实现这样的东西(我给出一个SQL查询示例仅供参考)
Delete from entityName where id = @id
目前,我正在使用下面的C#代码在CRM中创建记录
dictionary.Add("code", new CrmDataTypeWrapper(code, CrmFieldType.Raw));
dictionary.Add("id", new CrmDataTypeWrapper(id, CrmFieldType.Raw));
Guid EvntId = _client.CrmInterface.CreateNewRecord("entityname", dictionary, "", false, new System.Guid());
现在我想在此逻辑之前编写一个代码块,如果它们存在传递的ID,它将删除所有记录。
要删除CRM中的实体,您必须首先获取实体以获取实体的GUID
。
IOrganizationService
接口包含Delete
方法,该方法需要实体类型(LogicalName
)和CRM创建的实体的GUID。
这是我们如何做到的。
QueryExpression oppQuery = new QueryExpression("opportunity");
oppQuery.ColumnSet = new ColumnSet(new string[] { "opportunityid" });
oppQuery.Criteria.AddCondition(new ConditionExpression("parentcontactid", ConditionOperator.Equal, contact.Id));
EntityCollection opportunities = crmSvc.RetrieveMultiple(oppQuery);
foreach (var opportunity in opportunities.Entities)
{
service.Delete("opportunity", opportunity.Id);
}
这意味着您可以根据条件删除实体,方法是根据您的条件首先获取您需要的实体。
oppQuery.Criteria.AddCondition(new ConditionExpression("<your id field>", ConditionOperator.Equal, <your id>));
在此行上,您可以指定用于删除相关实体的条件。
如果您不确定Dynamics中是否存在这些ID,则应尝试捕获删除尝试,因为如果您尝试删除Dynamics中不存在的记录,Dynamics将向您抛出FaultException
。
var ids = new Collection<Guid>();
foreach (var id in ids)
{
try
{
_service.Delete("[entityName]", id);
}
catch (FaultException)
{
continue;
}
}
赞美Adriani6答案:
我想您正在尝试删除一组具有特定字段值的记录。但该字段被命名为id
,它不是主键。
Dynamics CRM中没有等效的以下SQL查询。
Delete from entityName where id = @id
您必须使用service.RetrieveMultiple
获取与非主键条件匹配的所有实体记录,然后遍历每个记录的结果集以使用主键发出service.Delete
请求。
QueryExpression query = new QueryExpression("entityName");
query.ColumnSet = new ColumnSet(new string[] { "eventId", "code"});
query.Criteria.AddCondition(new ConditionExpression("id", ConditionOperator.Equal, id));
EntityCollection events = service.RetrieveMultiple(query);
foreach (var event in events.Entities)
{
service.Delete("entityName", event.Id);
}