使用Dynamics 365的控制台应用程序检索任何特定实体的所有重复记录

问题描述 投票:0回答:1

我想创建一个控制台应用程序,它可以检索任何特定实体的所有重复记录,并希望将记录转储到文件中。

我一直在尝试使用this的例子。但在检索实体时面临问题。正如我所说,它可以是客户提供的任何实体,我也需要验证该实体名称。

我也试过下面的代码,但它会尝试获取特定帐户ID的重复记录:

private void RetrieveDuplicates()
{
      string entityLogicalName = "account";
      var entity = _serviceProxy.Retrieve(entityLogicalName, Guid.NewGuid(), new ColumnSet("name"));

      // PagingInfo is Required. 
      var request = new RetrieveDuplicatesRequest
      {
            BusinessEntity = entity,
            MatchingEntityName = entityLogicalName,
            PagingInfo = new PagingInfo() { PageNumber = 100, Count = 250 }
      };

      Console.WriteLine("Retrieving duplicates");
      var response = (RetrieveDuplicatesResponse)_serviceProxy.Execute(request);
}
console-application microsoft-dynamics dynamics-365
1个回答
0
投票

那么,RetrieveMultiple就是这里的答案。

我现在所做的是创建一个新的方法,如下所示,以检索所有数据:

主要方法

public void RetrieveDuplicates(IOrganizationService _crmService)
{
    Console.Write("Please enter entity's logical name: ");
    string entityLogicalName = Console.ReadLine();
    //entityLogicalName = "account";

    Console.Write("Please enter duplicated column: ");
    string duplicatedColumn = Console.ReadLine();


    QueryExpression query = new QueryExpression(entityLogicalName)
    {
        ColumnSet = new ColumnSet(duplicatedColumn)
    };
    query.AddOrder(duplicatedColumn, 0);

    var results = _crmService.RetrieveAll(query)
                             .GroupBy(e => e.GetAttributeValue<string>(duplicatedColumn), e => e);

    foreach (var group in results)
    {
        var count2 = group.Count();
        if (count2 > 1)
        {
            using (StreamWriter writer = new StreamWriter("important" + DateTime.Now.ToString("ddMMMyyyyhhmm") + ".txt"))
            {
                foreach (var entity in group)
                {
                    foreach (var attribute in entity.Attributes)
                    {
                        writer.WriteLine("{0} => {1} || ", attribute.Key, attribute.Value);
                    }
                }
            }
        }
    }
}

执行所有方法

public IEnumerable<Entity> RetrieveAll(this IOrganizationService crmService, QueryExpression query)
{
    if (crmService == null)
    {
        throw new ArgumentNullException(nameof(crmService));
    }
    if (query == null)
    {
        throw new ArgumentNullException(nameof(query));
    }
    if (query.TopCount.HasValue)
    {
        // You cannot use paging info with a top count
        var results = crmService.RetrieveMultiple(query);
        foreach (var entity in results.Entities) yield return entity;
    }
    else
    {
        EntityCollection results = null;
        query.PageInfo = new PagingInfo
        {
            PageNumber = 1
        };
        do
        {
            results = crmService.RetrieveMultiple(query);

            query.PageInfo.PageNumber++;
            query.PageInfo.PagingCookie = results.PagingCookie;
            foreach (var entity in results.Entities) yield return entity;
        } while (results?.MoreRecords != false);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.