如何在Dynamics CRM 2011中获取每个帐户的活动?

c# dynamics-crm-2011 dynamics-crm

1834 观看

2回复

976 作者的声誉

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

我需要从中读取所有帐户并读取与之关联的活动(实际上,只有最后一个已关闭和未完成的活动)。

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

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

在以下问题中提出了这种建议:通过C#检索CRM中所有帐户的列表?

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

我也是C#的新手。

编辑:感谢乔迪,我现在似乎能够使用此特定类型的活动:

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();

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

并且,是否有可能只为每个帐户获取最新的未结清和结清活动?

作者: ivan_bilan 的来源 发布者: 2016 年 3 月 18 日

回应 (2)


1

1355 作者的声誉

它看起来像您需要的联接。

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

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

//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上检查示例。

作者: Jordi 发布者: 21.03.2016 12:37

3

186 作者的声誉

决定

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以提高性能,但是要注意限制:有关ExecuteMultipleRequest限制的信息

更新

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

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

这是所有实体的所有开箱即用状态代码和状态的列表

如果您需要检索,假设仅是最近的未完成活动(您将自己定义需要多久的活动),请拨打以下电话:

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();

这是一个非常基本的代码,并且在Web上有很多有关它的信息。

作者: Alex 发布者: 22.03.2016 05:33
32x32