LinkEntity
В одной из предыдущих статей RelatedEntities было показано, как в одном запросе Retrieve вернуть основную запись и кучу связанных с ней (вместе с их полями). Теперь рассмотрим обратный манер – необходимо вернуть кучу основных записей и по одной «дочерней» связанной записи. При этом основная запись ссылается на дочернюю посредством лукапа (N:1). И все это одним запросом.
using System; using System.Collections.Generic; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client; using Microsoft.Xrm.Sdk.Query; using System.ServiceModel; using System.ServiceModel.Description; using System.Runtime.Serialization; namespace LinkEntityConsole { class LinkEntityConsole { static void Main(string[] args) { // Подключаемся к CRM ClientCredentials credentials = new ClientCredentials(); credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2012"); 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; // Формируем запрос var query = new QueryExpression("account"); var columnNames = new[] { "accountid", "name" }; query.ColumnSet = new ColumnSet(columnNames); // Подкючаем связанный объект var colsAccount = new[] { "firstname", "lastname" }; LinkEntity linkEntityAccount = new LinkEntity() { LinkFromEntityName = "account", LinkFromAttributeName = "primarycontactid", LinkToEntityName = "contact", LinkToAttributeName = "contactid", JoinOperator = JoinOperator.Inner, Columns = new ColumnSet(colsAccount), EntityAlias = "Contacts" }; query.LinkEntities.Add(linkEntityAccount); // Выполняем запрос EntityCollection _results = service.RetrieveMultiple(query); if (_results == null) return; foreach (var ent in _results.Entities) { Console.WriteLine(ent.Attributes["name"]); // Выводим поля со вязанного объекта Console.WriteLine(" - " + (ent.Attributes["Contacts.firstname"] as AliasedValue).Value + " " + (ent.Attributes["Contacts.lastname"] as AliasedValue).Value); } Console.ReadKey(); } } }
Тут все просто:
- Подключаемся к CRM;
- Формируем запрос на возвращение Организаций;
- К нему подключаем связанный объект – Контакт и указываем параметры этой связи;
- Выводим полученную информацию.