エンティティの関連付けへのアクセス (Dynamics CRM 2015)

 

公開日: 2016年11月

対象: Dynamics CRM 2015

Developer Extensions for Microsoft Dynamics 365 は、関連エンティティを取得するためのヘルパー メソッドも提供します。OrganizationServiceContext の標準動作では、この例で示すように、関連エンティティにアクセスする前にエンティティ関係メンバーが明示的に読み込まれている必要があります。

var connection = CrmConnection.Parse("Url=http://crm.contoso.com/xrmContoso; ProxyTypesAssembly=Xrm;");

using (var service = new OrganizationService(connection))
using (var context = new OrganizationServiceContext(service))
{
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");

var currencyEmpty = contact.GetRelatedEntity<Entity>("transactioncurrency_contact");
var currencyEmptyStatic = contact.transactioncurrency_contact;

// currency is always null until after calling LoadProperty

Console.WriteLine(currencyEmpty == null);
Console.WriteLine(currencyEmptyStatic == null);

context.LoadProperty(contact, "transactioncurrency_contact");

// read related entity dynamically
var currency = contact.GetRelatedEntity<Entity>("transactioncurrency_contact");
Console.WriteLine(currency.GetAttributeValue<string>("currencyname"));

// read related entity statically
var currencyStatic = contact.transactioncurrency_contact;
Console.WriteLine(currencyStatic.CurrencyName);
}

文字列ベースの関係名と属性名ではなく、静的に型指定されたメンバーを操作する場合は、関係引数を静的な式として受け取る一連のヘルパー メソッドがあります。 式は、単一の Entity パラメーターを持つラムダ式の形式をとります。 以下を含め、すべての OrganizationServiceContext 関係メソッドに対してヘルパー オーバーロードが存在します。
LoadProperty
GetRelatedEntity
GetRelatedEntities
AttachLink
DetachLink
AddLink
DeleteLink
AddRelatedObject

LoadProperty ヘルパー メソッドの使用例を次に示します。

using Microsoft.Xrm.Client;

using (var service = new OrganizationService(connection))
using (var context = new OrganizationServiceContext(service))
{
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
context.LoadProperty(contact, c => c.transactioncurrency_contact);
var currency = contact.transactioncurrency_contact;
Console.WriteLine(currency.CurrencyName);
}

別のヘルパー セットが LoadProperty メソッドを暗黙的に呼び出し、OrganizationServiceContext 参照を最初のパラメーターとして受け取ります。 これは、ここで示すように GetRelatedEntity メソッドおよび GetRelatedEntities メソッドに適用されます。

using (var service = new OrganizationService(connection))
using (var context = new OrganizationServiceContext(service))
{
// use helper method that calls LoadProperty implicitly
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
var currency = contact.GetRelatedEntity(context, "transactioncurrency_contact");
Console.WriteLine(currency.GetAttributeValue<string>("currencyname"));
}

using (var service = new OrganizationService(connection))
using (var context = new OrganizationServiceContext(service))
{
// use helper method that calls LoadProperty implicitly and maintains static typing
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
var currency = contact.GetRelatedEntity(context, c => c.transactioncurrency_contact);
Console.WriteLine(currency.CurrencyName);
}

CrmOrganizationServiceContext または生成された XrmServiceContext を使用すると、関係にアクセスするための最も簡潔なコードを作成できます。 このコンテキストでは、ここで示すようにコンテキスト参照を内的に追跡し、LoadProperty を暗黙的に呼び出すことで、関連エンティティの自動遅延読み込みが可能になります。

using (var service = new OrganizationService(connection))
using (var context = new CrmOrganizationServiceContext(service))
{
// this context manages the context reference internally
var contact = context.CreateQuery<Contact>().First(c => c.FirstName == "Bob");
var currency = contact.transactioncurrency_contact;
Console.WriteLine(currency.CurrencyName);
}

関連項目

Developer Extensions のコンテキスト オブジェクト モデル (Dynamics CRM 2015)
構成ファイルを使用したコンテキストの構成 (Dynamics CRM 2015)
エンティティのコンテキストへの添付 (Dynamics CRM 2015)
コンテキストの機能拡張

© 2017 Microsoft. All rights reserved. 著作権