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;
- Задаем параметры отбора связанных записей;
- Задаем запрос для отбора основного объекта и связываем его с параметрами отбора связанных записей;
- Выполняем запрос и выводим данные основной и связанных записей.