C# 在CRM 2011中检查同一请求中是否存在多条记录

C# 在CRM 2011中检查同一请求中是否存在多条记录,c#,dynamics-crm-2011,C#,Dynamics Crm 2011,我需要将数据从SQL数据库迁移到CRM 2011。 我已经运行了一个first-pass设置,只设置了SQL数据库中的必填字段和标识符。 现在,我应该检索实体并使用查找更新值 我正在使用批量操作(ExecuteMultipleRequest)执行插入和更新。 是否有类似的方法来检查实体集合是否已经创建,如果是这样的话,是否可能检索它们的id 单一实体检查确实在减缓速度 这是我用来检查记录是否存在的方法: /// <summary> /// Check if the entity wi

我需要将数据从SQL数据库迁移到CRM 2011。 我已经运行了一个first-pass设置,只设置了SQL数据库中的必填字段和标识符。 现在,我应该检索实体并使用查找更新值

我正在使用批量操作(ExecuteMultipleRequest)执行插入和更新。 是否有类似的方法来检查实体集合是否已经创建,如果是这样的话,是否可能检索它们的id

单一实体检查确实在减缓速度

这是我用来检查记录是否存在的方法:

/// <summary>
/// Check if the entity with the specified value on the specified field exists
/// </summary>
/// <param name="entityName">Name of the entity</param>
/// /// <param name="field">Field to be checked</param>
/// <param name="fieldValue">Value to be checked</param>
/// <returns>The GUID of the existing return if it exists, an empty one otherwise</returns>

public Guid CheckIfExisting(string entityName, string field, string fieldValue)
{
    try
    {
        QueryExpression entityQuery = new QueryExpression(entityName);
        entityQuery.ColumnSet = new ColumnSet(entityName + "id");
        entityQuery.Criteria = new FilterExpression();
        entityQuery.Criteria.AddCondition(field, ConditionOperator.Equal, fieldValue);

        EntityCollection retrievedEntities = service.RetrieveMultiple(entityQuery);
        if (retrievedEntities.Entities.Count >0 && retrievedEntities.Entities[0].Id != null)
            return retrievedEntities.Entities[0].Id;
        else
            return Guid.Empty;
    }
    catch (Exception e)
    {
        Console.WriteLine("There was an exception of type" + e.GetType());
        Console.WriteLine("Error message " + e.Message);
        Console.WriteLine(e.StackTrace);

    }
    return Guid.Empty;
}
//
///检查指定字段中具有指定值的实体是否存在
/// 
///实体名称
//////要检查的字段
///要检查的值
///现有返回的GUID(如果存在),否则为空
公共Guid CheckIfExisting(字符串entityName、字符串字段、字符串字段值)
{
尝试
{
QueryExpression entityQuery=新的QueryExpression(entityName);
entityQuery.ColumnSet=新列集(entityName+“id”);
entityQuery.Criteria=new FilterExpression();
entityQuery.Criteria.AddCondition(字段,ConditionOperator.Equal,fieldValue);
EntityCollection retrievedEntities=service.RetrieveMultiple(entityQuery);
如果(retrievedEntities.Entities.Count>0&&retrievedEntities.Entities[0].Id!=null)
返回retrievedEntities.Entities[0].Id;
其他的
返回Guid.Empty;
}
捕获(例外e)
{
WriteLine(“存在类型为“+e.GetType()的异常”);
Console.WriteLine(“错误消息”+e.message);
控制台写入线(如StackTrace);
}
返回Guid.Empty;
}

我已经为CRM做了许多此类集成工作。这主要有两种方法

最简单的方法是使用优秀的金山SSIS组件进行CRM。这很好,因为它为您提供了一个现成的“升级”选项,允许您执行此操作。但是,它确实遇到了与CRM检查每个记录相同的问题

第二种更复杂但性能更好的方法是使用SSI为您比较事物。基本前提是获得两个列表,一个用于源,另一个来自目标,并使用完整的外部联接将它们联接起来。使用条件拆分,您的逻辑如下

  • 如果其在源中但不在目标中,请插入
  • 如果其位于目标但不在源中,请删除
  • 如果两者都有,则更新

当性能是一个因素时,这适用于大量数据。

您是否可以共享用于检查现有记录的代码。我们可以处理查询以提高性能。此外,SQL Server索引还有助于缩短查询时间。我非常喜欢您的第二个选项!我想我会在我的下一个项目中使用它,但现在这需要对代码进行巨大的更改,我没有时间来实现。我现在的想法是允许检索查询上的所有值(如由或条件连接的块),将检索到的实体添加到以字段为键的字典中,并直接在字典中检查是否存在。确定之后,您可以同时使用查询表达式的in条件并传递ID列表。这只是CRM的一次成功。在回答中,你将循环通过你传递的ID列表,看看哪些ID回来了Kevin,我们使用你的第二个选项,我告诉你它真的很快。我要补充的一件事是,不要使用SSIS中的排序,而是对源和目标组件进行排序,因为它要快得多。