如何在 Dynamics CRM 2011 中获取每个帐户的活动?
How to get Activities of each Account in Dynamics CRM 2011?
我正在使用此 C# SDK 从 Dynamics CRM 2011 获取数据:https://msdn.microsoft.com/en-us/library/gg695803(v=crm.5).aspx
我需要从中读取所有帐户并读取与其关联的活动(实际上,只有最后一个关闭和打开 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#?
问题是,我找不到获取活动的方法。是否有与活动关联的字段?我所能找到的只是一个单独的 Activity 实体,它在 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();
现在,有没有办法同时为每个帐户获取所有 Activity 类型?
而且,是否可以只获取每个帐户的最新打开和关闭 Activity?
看来是你需要的加入。
根据 Activity 类型,存在不同的实体。
以下是任务活动的例子,其他类似。
//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 示例。
RegardingObjectId
字段是将 activity 实体记录关联到帐户实体记录的字段之一。
您可以像这样获取 activity
个实体记录:
var activityBaseList = serviceContext.CreateQuery<Activity>()
.Where(x => x.RegardingObjectId.Id == accountId).ToList();
这是一个基础实体,它只有 关于 activity 的基本信息。如果您需要有关每个 activity 记录的更多信息(在大多数情况下您确实需要),那么您将不得不使用不同的 activity 类型进行多次查询。像这样:
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();
这是一个非常基本的代码,网上有很多关于它的信息。
我正在使用此 C# SDK 从 Dynamics CRM 2011 获取数据:https://msdn.microsoft.com/en-us/library/gg695803(v=crm.5).aspx
我需要从中读取所有帐户并读取与其关联的活动(实际上,只有最后一个关闭和打开 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#?
问题是,我找不到获取活动的方法。是否有与活动关联的字段?我所能找到的只是一个单独的 Activity 实体,它在 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();
现在,有没有办法同时为每个帐户获取所有 Activity 类型?
而且,是否可以只获取每个帐户的最新打开和关闭 Activity?
看来是你需要的加入。
根据 Activity 类型,存在不同的实体。
以下是任务活动的例子,其他类似。
//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 示例。
RegardingObjectId
字段是将 activity 实体记录关联到帐户实体记录的字段之一。
您可以像这样获取 activity
个实体记录:
var activityBaseList = serviceContext.CreateQuery<Activity>()
.Where(x => x.RegardingObjectId.Id == accountId).ToList();
这是一个基础实体,它只有 关于 activity 的基本信息。如果您需要有关每个 activity 记录的更多信息(在大多数情况下您确实需要),那么您将不得不使用不同的 activity 类型进行多次查询。像这样:
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();
这是一个非常基本的代码,网上有很多关于它的信息。