【问题标题】:MS Dynamics 365 CRM online - dump entityMS Dynamics 365 CRM 在线 - 转储实体
【发布时间】:2021-03-18 02:41:49
【问题描述】:

我是 Dynamics 365 的新手。我们使用的是 Dynamics 365 CRM 在线版。 我需要将几个实体转储到我们的本地 SQL 服务器。

我找到了很多示例,但没有找到整个实体(包括查找列)。

在这个(最相关的)示例中什么对我不起作用:

  1. 我需要所有列的列表(我真的需要在 new Contact{} 中指定完整的列列表吗?)

  2. 在结果中获取查找值而不是 ID (guid)

                 `var orgContext = new OrganizationServiceContext(service);
                 // Retrieve the Contact records that we created previously.
                 List<Contact> contacts = (from c in orgContext.CreateQuery<Contact>()
                                           where c.Address1_City == "New York"
                                           select new Contact
                                           {
                                               ContactId = c.ContactId,
                                               FirstName = c.FirstName,
                                               LastName = c.LastName
                                           }).ToList<Contact>();
                 Console.Write("Contacts retrieved, ");'
    

【问题讨论】:

  • Microsoft Dynamics 365 包含一个whole line of ERP and CRM products,请具体说明您正在使用的那个。许多(如果不是全部)都有在线组件/平台。 Dynamics 365 Finance 等一些产品支持built in 将数据实体导出到外部数据库(无需自定义代码)。
  • 底层 Microsoft Dataverse(以前称为“通用数据服务”或“CDS”)也可用于导出数据实体 (source)。 This page 列出了一个 API,如果您想自己编写代码,可以使用该 API。
  • 我们公司使用全球在线解决方案,没有机会使用 Dynamics365 的管理部分。但我们可以编写自定义导出代码。听起来很傻,但这是主要设置。我喜欢使用 CDS 将一些 Dynamincs 实体转储(同步和增量同步)到本地 SQL 服务器的编写服务。我真正喜欢找到的是 c# 中的实体(理想情况下是 Activity 指针)转储示例。

标签: c# dynamics-crm dynamics-365


【解决方案1】:

虽然您所做的是一种很好的做法,即定义了select 列表中提到的属性列表,但您可以使用以下语法选择所有属性。值得一提的是,这将对性能产生巨大影响。

List<Contact> contacts = (from c in orgContext.CreateQuery<Contact>()
                                   where c.Address1_City == "New York"
                                   select c).ToList<Contact>();

来回答您的下一个问题 - 获取查找字段,为此您可以使用 join。例如。使用以下语法从帐户获取主要联系人查找。这使用实体之间的主键和外键来加入。

var accountQuery = from account in context.CreateQuery("account")
                   join contact in context.CreateQuery("contact")
                   on account["primarycontactid"] equals contact["contactid"]
                   where account["name"] ==   "Some Company Name"
                    select new {
                           Name = account["name"],
                           Email = account["emailaddress1"],
                           Manager = contact
                      };

foreach (var account in accountQuery)
{
    Console.WriteLine(account.Name + " is run by: " + account.Manager["fullname"]);
}

Read more

使用 LINQ 查询是一种方法,还有其他方法,如 web api、fetchxml 和查询表达式来完成相同的工作。您仍然必须捕获转储作业的上次运行时间,并使用大于上次运行时间戳的 createdon 和 modifiedon 时间戳过滤增量数据。

不用说,Activity 是最繁琐的实体,涉及到多个表,如 Activity 指针、Activity 方等。

【讨论】:

  • 嗨阿伦。非常感谢您的回复。当我需要在常规实体中添加所有查找时,我是否需要手动完成该工作? (例如,对于我看到的“创建者”帐户实体中的原始列,我可以加入查找表值......但我的目标是使数据从在线 CRM 泵到本地。我试图避免加入所有查找的大量工作......(有很多表具有疯狂的查找数量......我从 C-DATA 公司找到了 ODBC 驱动程序......但我不想成为 3dr 派对软件的依赖者......
  • @PavelKohout 当然,您必须存储所有引用表、相关表数据以及主要事务数据以避免链接中断。这正是数据导出服务或 CDATA ODBC 驱动程序所做的。
  • 一些开源解决方案可以映射所有包含查找的实体,这对我来说是一个很好的解决方案......
  • @PavelKohout 如果您只需要查找名称,您将获得与我的答案相同的父查询。如果您需要与系统用户、帐户、联系人等相关的所有内容,则必须先转储它们。恐怕今天还没有你要求的免费 :)
  • @arnun 我明白了,那个好东西需要 $$,但是哪一个。如果我们跳过问题的预算部分,则存在安全原因。 DX 365 有几个“ODBC、ADO……”驱动程序供应商,但是……公司数据是通过它流动的……哪家公司还可以?哪个不是?我没有找到任何“微软推荐”的合作伙伴......这就是为什么我开始痛苦地制造自己的数据泵:)
【解决方案2】:

您可以使用 Dynamics 365 (CRM) 的 Excel 导出功能轻松完成此操作

只需将所有列添加到高级查找视图。

  1. 高级查找按钮

  2. 实体选择器(查找)

  3. 编辑列

  4. 将所有列添加到视图(有关更多说明,请参见下面的单独图片)。

  5. 查看结果

如果您有超过 100000 条记录,您可能会达到限制。

“我们即将在 Excel 文件中生成您的 Dynamics 365 数据(超过 5000 条记录)。如果记录超过 100000 条,则只会导出前 100000 条。”

除了buypass the 100000 limit,你还可以使用Export to Excel Tool from XRM Toolbox,它可以帮助你获得所有记录,无需任何编码。

【讨论】:

  • 感谢您的回复,但必须使用 c# .net 库来完成。不像手动工作...您是否有将实体导出为 c# 代码的示例(例如,包含所有查找列的活动指针实体)
  • 如果您使用从 XRM 工具箱导出到 Excel,这又使用 c# 代码。它不会解决你的目的吗?
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 2019-08-12
  • 2019-04-30
  • 2020-06-22
  • 2019-02-25
  • 2019-06-24
相关资源
最近更新 更多