Разработка
31
Июл
0

RelatedEntities

В CRM 2011 при использовании запроса Retrieve можно за один раз вернуть не только записи основной сущности, но и связанных с ней посредством связи 1N, NN или N1. И это касается не только запросов Retrieve. Используя свойства RelatedEntities Вы определяете основной и связанные объекты, которые требуете создать/обновить и название связи между ними. Это поможет уменьшать количество кода, а также положительно скажется на производительности, т.к. нужно будет выполнять меньше запросов.

З.Ы. Данный фокус не работает для RetrieveMultiple.

Рассмотрим пример: требуется вернуть запись Организации и связанных с ней Контактов. И все этом можно выполнить одним запросом:

Тут мы делаем следующее:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace RelatedEntities
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1йфя\"ЦЫЧ", "D2011");
            Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;
            
            // Создаем объект связи
            Relationship relationship = new Relationship();
            relationship.SchemaName = "contact_customer_accounts"; // Название связи между Контактом и Организацией
            
            // Задаем фильтр для отбора связанных записей
            QueryExpression query = new QueryExpression();
            query.EntityName = "contact"; // связанный объект
            query.ColumnSet = new ColumnSet(true); // Возвращаем все поля из связанных записей
            query.Criteria = new FilterExpression(); // Отбираем только активные связанные Контакты
            query.Criteria.AddCondition(new ConditionExpression("statecode", ConditionOperator.Equal, "Active"));

            // Собираем данные о связанном объекте
            RelationshipQueryCollection relatedEntity = new RelationshipQueryCollection();
            relatedEntity.Add(relationship, query);
            
            // Создаем запроса основого объекта и ...
            RetrieveRequest request = new RetrieveRequest();
            request.ColumnSet = new ColumnSet("accountid", "name"); // Возвращаем два поля основного объекта
            request.Target = new EntityReference { Id = new Guid("BBC7A0D8-EAEB-E211-93ED-000C29461FAD"), LogicalName = "account" };
            request.RelatedEntitiesQuery = relatedEntity; // Добавляем возвращение связанных записей
            
            // Выполняем запрос
            RetrieveResponse response = (RetrieveResponse)service.Execute(request);
            
            // Выводим поля из основного объекта
            Console.WriteLine("Organisation: " + response.Entity["name"]);

            // Получаем дочерние записи и поочереди выводим их
            DataCollection<Entity> RelatedEntitis = ((DataCollection<Relationship, EntityCollection>)(((RelatedEntityCollection)(response.Entity.RelatedEntities))))[new Relationship("contact_customer_accounts")].Entities;

            Console.WriteLine("Related Contacts:");
            foreach (var RelatedEntity in RelatedEntitis)
            {
                Console.WriteLine(" - " + RelatedEntity["firstname"] + " " + RelatedEntity["lastname"]);
            }

            Console.WriteLine("Press Enter");
            Console.ReadLine();
        }
    }
}
  • Подключаемся к CRM;
  • Задаем параметры отбора связанных записей;
  • Задаем запрос для отбора основного объекта и связываем его с параметрами отбора связанных записей;
  • Выполняем запрос и выводим данные основной и связанных записей.


Комментарии (0)

*

code