11

CRM からエンティティのリストを取得しようとしていますが、それぞれに関連するエンティティを取得したいと考えています。これまでのところ、次のコードがあります。

FilterExpression filterExpression = new FilterExpression();
ConditionExpression condition = new ConditionExpression(Constants.ModifiedOnAttribute, ConditionOperator.GreaterEqual, lastSync);
filterExpression.AddCondition(condition);

QueryExpression query = new QueryExpression()
{
     EntityName = entityName,
     ColumnSet = new ColumnSet(attributesMetadata.Select(att => att.Name).ToArray<string>()),
     Criteria = filterExpression,
     Distinct = false,
     NoLock = true
};

RetrieveMultipleRequest multipleRequest = new RetrieveMultipleRequest();
multipleRequest.Query = queryExpression;

RetrieveMultipleResponse response = (RetrieveMultipleResponse)proxy.Execute(multipleRequest);

変数の応答では、EntityCollection 属性を確認できますが、内部の関連エンティティは常に空になります。

関連エンティティ数は 0 です

RetrieveRequest を使用して 1 つずつ取得するのではなく、RetrieveMultipleRequest を使用して、関連するエンティティと共に特定のエンティティのセットを取得できるかどうかを知りたいです。

4

2 に答える 2

9

関連するエンティティデータを取得する1つのアプローチ-クエリにLinkEntitiesを追加します。以下の例から、これを作成する方法がわかります。

LinkEntity linkEntity = new LinkEntity("email", "new_emails", "activityid", "new_relatedemail", JoinOperator.Inner);
linkEntity.Columns.AddColumn("versionnumber");
linkEntity.Columns.AddColumn("new_emailsid");
linkEntity.EntityAlias = "related";

query = new QueryExpression("email");
query.ColumnSet.AddColumn("activityid");
query.ColumnSet.AddColumn("versionnumber");
query.Criteria.AddCondition("modifiedon", ConditionOperator.NotNull);
query.LinkEntities.Add(linkEntity);

次に、上記で指定したEntityAliasを使用して、関連するエンティティの属性にアクセスできます。

foreach (Entity entity in entities.Entities)
{
    if ((long)(entity["related.versionnumber"] as AliasedValue).Value > 0)
    {
        stop = false;
    }
}
于 2012-12-04T20:05:23.947 に答える
5

これRetrieveMultipleRequestは、特定のタイプのエンティティの複数のインスタンスを返すためのものです。C#のCRM SDKを使用して1年を過ごしましたが、これらの関連するエンティティコレクションを1つのクエリで入力する方法が見つかりませんでした。これには基本的に2つのオプションがあります。

  1. SergeySが推奨するようにAliasedValueを使用します。1:多くの関係を照会するときは、同じ親エンティティに対して複数の結果が返される可能性があることに注意してください。これは私がいつも使うものです。

  2. アクセスする関係ごとに2番目のクエリを実行します。IN最初の結果ごとに個別のクエリを実行するのではなく、最初の結果に基づいて2番目のクエリでステートメントを 使用できると、パフォーマンスが向上する可能性があります。

以下は、違いを示すためのいくつかの擬似コードです。

var contacts = GetContacts();

// One Request to get the cars for the contacts
var cars = GetCarsWhereContactIdIn(contacts.Select( c => c.new_ContactId));

foreach(var c in contacts){
    c.new_Cars.AddRange(cars.where(car => car.new_contactId = c.ContactId));
}

// Verses
var contacts = GetContacts();

foreach(var c in contacts){
    // One Request for each contact
    c.new_Cars.AddRange(GetCarsForContact(c.ContactId));
}
于 2012-12-04T21:18:38.760 に答える