2016-02-08 3 views
2

Обзор:Как передать Xrm.EntityCollection в список?

я кодирование FetchXML запроса, возвращающие пользователей почтовых ящиков для инвалидов в случае онлайн CRM Dynamics 2015. Теперь я пришел к тому, что результаты запроса должны быть привязаны к ListView. (Проект использует Dynamics SDK 2015 libs.)

Для этого я попытался передать возвращенный результат, который является EntityCollection -> в список. Но CRMSDKTypeProxy не может быть найден в моем коде для трансляции.

Я следовал второй ответ этот пример для того, чтобы сделать отливку:

Convert Entity Collection to Ilist where Entity Collection does not implement IEnumerable

Вопрос:

Кто-нибудь знает, как ссылаться на CRMSDKTypeProxy? Или любой альтернативный способ бросить мою коллекцию в список?

Код: (короткий пример)

 if (ctrl.CrmConnectionMgr != null && ctrl.CrmConnectionMgr.CrmSvc != null && ctrl.CrmConnectionMgr.CrmSvc.IsReady) 
     { 
      CrmServiceClient svcClient = ctrl.CrmConnectionMgr.CrmSvc; 
      if (svcClient.IsReady) 
      { 
       // Get data from CRM . 
       string DisabledMailBoxUsersFetchXML = 
        @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'> 
         <entity name='systemuser'> 
         <attribute name='fullname' /> 
         <attribute name='businessunitid' /> 
         <attribute name='title' /> 
         <attribute name='address1_telephone1' /> 
         <attribute name='positionid' /> 
         <attribute name='systemuserid' /> 
         <order attribute='fullname' descending='false' /> 
         <link-entity name='mailbox' from='mailboxid' to='defaultmailbox' alias='aa'> 
          <filter type='and'> 
          <condition attribute='statecode' operator='eq' value='1' /> 
          </filter> 
         </link-entity> 
         </entity> 
        </fetch>"; 


       var DisabledMailBoxUsersResult = svcClient.GetEntityDataByFetchSearchEC(DisabledMailBoxUsersFetchXML); 


       if (DisabledMailBoxUsersResult != null) 
       { 
        //perform the cast here ---> 
        var disabledMailBoxUsersList = (from t in DisabledMailBoxUsersResult.Entities select t as CRMSDKTypeProxy.SystemUser).ToList(); 
        disabledMailboxUserLBx.ItemsSource = disabledMailBoxUsersList; 
       } 
       else 
        MessageBox.Show("All user's mailboxes are approved.."); 

      } 
     } 

ответ

6

Вы можете использовать метод ToEntity<T> сделать преобразование к сильному типизированному объекту, как это: (В этом фрагменте service является объект, реализующий интерфейс IOrganizationService и query является QueryExpression объектом.)

// RetrieveMultiple will never return null, so this one-liner is safe to use. 
var userList = service.RetrieveMultiple(query) 
    .Entities 
    .Select(e => e.ToEntity<SystemUser>()) 
    .ToList(); 

Я заметил, что вы используете CrmServiceClient в Microsoft.Xrm.Tooling.Connector пространство имен. Она была введена в Dynamics CRM 2013.

Ваш код может выглядеть следующим образом:

var userList = svcClient.OrganizationServiceProxy 
    .RetrieveMultiple(new FetchExpression(fetchXml)) 
    .Entities 
    .Select(e => e.ToEntity<SystemUser>()) 
    .ToList(); 

и в качестве альтернативы это должно работать также:

var userList = svcClient.GetEntityDataByFetchSearchEC(fetchXml) 
    .Entities 
    .Select(e => e.ToEntity<SystemUser>()) 
    .ToList(); 
+0

Я пробовал адаптировать этот код к моему, но нет определения для RetrieveMultiple. Это то, что я пробовал: 'var userList = svcClient.RetrieveMultiple (DisabledMailBoxUsersFetchXML) .Entities.Select (e => e.ToEntity ());' Какие-нибудь идеи в чем проблема? –

+0

Я упускал из виду тот факт, что вы используете пространство имен Microsoft.Xrm.Tooling.Connector. Продлил мой ответ. –

+0

Хорошо, это тип SystemUser, класс модели, который мне нужно добавить? –

1

@Henk ван Boeijen частично правильно. Вместо использования службы. Верните в его пример, замените его вызовом svcClient.GetEntityDataByFetchSearchEC (DisabledMailBoxUsersFetchXML).

var userList = svcClient.GetEntityDataByFetchSearchEC(DisabledMailBoxUsersFetchXML).Entities.Select(e => e.ToEntity<SystemUser>()); 

Если your'e не используя ранние связанных сущностей, то вы можете просто вызвать .ToList() на коллекции Entity.

var userList = svcClient.GetEntityDataByFetchSearchEC(DisabledMailBoxUsersFetchXML).Entities.ToList(); 

ПРИМИТИВЫ собственностью EntityCollection является DataCollection, который расширяет объект Collection, и вы можете назвать обычными методами.

+0

Хорошо, вы можете уточнить, откуда берется тип SystemUser? –

+1

Используете ли вы объекты, созданные с помощью CRMSVCUtil? –

+0

ОК не знал об этом инструменте. Сначала я посмотрю. http://stackoverflow.com/questions/21689217/systemuser-class-in-crm2011-sdk-sample-code –

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