2016-03-18 5 views
3

Я использую этот C# SDK, чтобы получить данные из Dynamics CRM 2011: https://msdn.microsoft.com/en-us/library/gg695803(v=crm.5).aspxКак получить активность каждой учетной записи в Dynamics CRM 2011?

мне нужно прочитать все учетные записи из него и читать деятельности, связанные с ним (на самом деле, только последним закрытым и открытым активность).

Чтобы получить счета я использую следующий код:

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#.

EDIT: Благодаря Jordi, теперь я, кажется, чтобы быть в состоянии получить определенный тип деятельности с помощью этого:

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

Теперь, есть способ, чтобы получить все виды деятельности, на один раз для каждого счета?

И возможно ли получить только последнюю открытую и закрытую активность для каждой учетной записи?

+0

Не могли бы вы описать задачу более подробно? Нужно ли вам получать информацию о деятельности, в которой указана учетная запись в поле «Относительно»? – Alex

+0

@Alex, мне нужно получить все действия для каждой существующей учетной записи. Я полагаю, что учетная запись указана в поле «Относительно», но я не уверен, что это мой вопрос, как сопоставлять учетные записи и действия? –

ответ

3

Поле 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.

UPDATE

Я не видел другого вопроса в нижней части. Если вам нужно получить только открытые действия, вам нужно будет добавить 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(); 

Это очень основной код и есть много информации об этом на WEB.

1

Это похоже на то, что вам нужно.

В зависимости от вида деятельности существуют разные объекты.

Следующий пример для задач Task, другие будут похожи.

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

Если вам нужны другие примеры довольно сложных запросов, пожалуйста, проверьте this пример на Git.

+0

Есть ли способ получить все виды активности сразу, а не только Task? –

+0

Откуда возникает учетная запись AccountTask в вашем примере? SDK, похоже, не распознает его. –

+0

Это ошибка: «Ошибка Не удалось найти имя типа или пространства имен« AccountTask »(вам не хватает директивы using или ссылки на сборку?)». Я новичок в C#, поэтому буду очень благодарен за вашу помощь. –

Смежные вопросы