【问题标题】:How to get Activities of each Account in Dynamics CRM 2011?如何在 Dynamics CRM 2011 中获取每个帐户的活动?
【发布时间】:2016-03-18 14:42:59
【问题描述】:

我正在使用这个 C# SDK 从 Dynamics CRM 2011 获取数据:https://msdn.microsoft.com/en-us/library/gg695803(v=crm.5).aspx

我需要从中读取所有 Accounts 并读取与之关联的 Activity(实际上,只有最后一个 Closed 和 Open Activity)。

要获取我使用以下代码的帐户:

var accounts = xrm.AccountSet
                .Select(acc => new
                {
                    name = acc.Name,
                    guid = acc.AccountId,
                    parent = acc.ParentAccountId,
                    number = acc.AccountNumber,
                    website = acc.WebSiteURL,
                });

在这个问题中已经建议了这种方式:Retrieve list of all accounts in CRM through C#?

问题是,我找不到获取活动的方法。是否有与活动相关的字段?我只能在 Dynamics CRM 2011 解决方案中找到一个具有自己的字段的单独活动实体。

我也是 C# 新手。

编辑:多亏了 Jordi,我现在似乎能够使用这个来获得特定类型的 Activity:

public class AccountTask
        {
            public string account;
            public string task;
        }

var accountsAndTasks = (from t in xrm.CreateQuery<Task>() join a in xrm.CreateQuery<Account>() on t.RegardingObjectId.Id equals a.AccountId select new AccountTask {

               account = a.Name,
               task = t.OwnerId.Name.ToString()
}).ToList();

现在,有没有办法为每个帐户一次获取所有活动类型?

而且,是否可以仅获取每个帐户的最新打开和关闭活动?

【问题讨论】:

  • 能否更详细地描述一下这个任务?您是否需要获取活动“关于”字段中指定帐户的活动?
  • @Alex,我需要将所有活动提取到每个现有帐户。我猜帐户是在相关字段中指定的,但我不确定,这是我的问题,如何匹配帐户和活动?

标签: c# dynamics-crm-2011 dynamics-crm


【解决方案1】:

RegardingObjectId 字段是将活动实体记录与客户实体记录相关联的字段之一。
您可以像这样获取activity 实体记录:

var activityBaseList = serviceContext.CreateQuery<Activity>()
            .Where(x => x.RegardingObjectId.Id == accountId).ToList();

这是一个基础实体,它只有关于活动的基本信息。如果您需要有关每个活动记录的更多信息(并且在大多数情况下确实需要),那么您将不得不使用不同的活动类型进行多个查询。像这样:

var emailActivityList = serviceContext.CreateQuery<Email>()
            .Where(x => x.RegardingObjectId.Id == accountId).ToList();
var taskActivityList = serviceContext.CreateQuery<Task>()
            .Where(x => x.RegardingObjectId.Id == accountId).ToList();
//and so on

我更喜欢使用QueryBase 请求,因为在这种情况下,您可以将查询组合成一个ExecuteMultipleRequest 调用IOrganizationService 以提高性能,但请注意限制:info about ExecuteMultipleRequest limitations

更新

我没有在底部看到您的其他问题。如果您只需要获取打开的活动,则需要将x.StateCode == 0 添加到上面编写的每个查询中,如果您只需要关闭的活动,则需要添加x.StateCode == 2。例如,仅检索打开的电子邮件活动:

var emailActivityList = serviceContext.CreateQuery<Email>()
            .Where(x => x.RegardingObjectId.Id == accountId && x.StateCode == 0).ToList();

Here is the list 所有实体的所有现成状态代码和状态。

如果您需要检索仅最近打开的活动(您将自行定义需要的最近时间),请进行以下调用:

var createdOnFilter = DateTime.Now.AddDays(-1); //change it as you need it
var emailActivityList = serviceContext.CreateQuery<Email>()
            .Where(x => x.RegardingObjectId.Id == accountId && 
                        x.StateCode == 0 && 
                        x.CreatedOn >= createdOnFilter)
            .ToList();

这是一个非常基本的代码,网上有很多关于它的信息。

【讨论】:

    【解决方案2】:

    看起来像你需要的加入。

    根据活动类型有不同的实体。

    以下示例用于任务活动,其他类似。

    //This will pull all the related tasks
    var accountsAndTasks = (from t in xrm.CreateQuery<Task>()
                join a in xrm.CreateQuery<Account>() on t.RegardingObjectId.Id  equals a.AccountId
               select new AccountTask {
                    account = a,
                    task = t
               }).ToList();
    

    如果您需要其他相当复杂的查询示例,请查看 Git 上的 this 示例。

    【讨论】:

    • 有没有办法一次获取所有活动类型而不仅仅是任务?
    • 您示例中的 AccountTask 来自哪里? SDK 似乎无法识别它。
    • 这是错误:“错误 1 ​​找不到类型或命名空间名称 'AccountTask'(您是否缺少 using 指令或程序集引用?)”。我是 C# 新手,非常感谢您的帮助。
    • 这是一个自定义类,您可以在代码中的任何位置定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    相关资源
    最近更新 更多