1

エンティティをフェッチContactしておりAccount、連絡先の名前と主要連絡先の名前にアクセスしたいと考えています。最初のものは非常に簡単にアクセスできますが、

EntityCollection result = proxy.RetrieveMultiple(...);
Entity entity = result.Entities[0].Attributes["fullname"];

もう1つは、例外をスローして私と戦っているようです。<entity>私が見る限り、前者の場合は直接名前の属性を持ち、後者の場合は名前の属性を持つフェッチ XML に依存します<entity><link-entity>

fullnameリンクされたエンティティであるフィールドにアクセスするにはどうすればよいですか?


連絡先の XML をフェッチします。

<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='contact'>
    <attribute name='fullname' />
  </entity>
</fetch>

アカウントの主要連絡先の XML をフェッチします。

<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='true'>
  <entity name='account'>
    <attribute name='accountid'/>
    <link-entity name='listmember' from='entityid' to='accountid' visible='false' intersect='true'>
      <link-entity name='list' from='listid' to='listid' alias='ab'>
      </link-entity>
    </link-entity>
    <link-entity name='contact' from='contactid' to='primarycontactid' visible='false' link-type='outer' alias='...'>
      <attribute name='fullname'/>
    </link-entity>
  </entity>
</fetch>
4

2 に答える 2

2

これは、元の質問、GCTANM からの回答、およびコメントに対する回答です (私の考えはコメントには長すぎます)。

ここにはいくつかの混乱があるようです。解決したいと思います。

GCTANM:

RetrieveMultiple は、選択目的でのみ LinkEntities を使用できます。クエリのプライマリ エンティティ以外のエンティティの属性を返すことはできません。

...

これらの連絡先レコードの他の属性については、各連絡先の ID を取得し、私のコメントに記載されている取得呼び出しのいずれかを実行する必要があります。

これらのステートメントは正しくありません。リンクされたすべてのエンティティの属性も返すことができます。MSDNにこの例があります。

チャムスター

その名前のとおり、Fetch は 1 つの結果しか返しませんよね。

FetchXml は 1 つの結果セットを返しますが、その結果セットには多くのレコードの詳細が含まれる場合があります。

どういうわけか、エンティティよりも XML で作業したい

Crm 4 Web サービスを使用できるようにしたい場合でも、RetrieveMultiple は Xml 結果セットを返します。

元の質問に答えるために。

したがって、返される EntityCollection には Crm 2011 で導入された少し独特の動作があるため、おそらく属性を取り戻すのに苦労している理由.

つまり、Crm 4 FetchXml クエリは、2011 年に Microsoft が結果を EntityCollection に解析するのを支援するために、解析する必要のある Xml 結果を返します。これにより、一部の属性にまったく予想外の名前が付けられます。

したがって、上記の連絡先の例を取り上げると、次のようなものを使用してフルネーム属性にアクセスする必要があります: contact1.fullname、連絡先はリンク、番号はリンクの数を表し、フルネームは属性です。

正確な形式を思い出せず、適切な例を見つけるのに苦労しています。クエリの後にブレークポイントを設定し、結果を調べることをお勧めします。データが見つかると確信していますが、上記のような名前が付いています。

適切な例を見つけることができれば (または明日作成できれば)、投稿を更新します。

于 2012-09-27T22:28:02.300 に答える
0

RetrieveMultipleLinkEntities は選択目的でのみ使用できます。クエリの主エンティティ以外のエンティティの属性を返すことはできません。

ただし、for the account クエリにprimarycontactid属性を含めると、そのプロパティには連絡先の が含まれます。属性はエンティティの「プライマリ名」属性であり、オブジェクトで使用されるものであるため、これは偶然です。ColumnSetEntityReferenceNamefullnamefullnamecontactEntityReference

あなたが要求したように、詳しく説明します:

RetrieveMultipleQueryBaseオブジェクト (最も一般的には)を受け取ります。これには、返される属性を定義するためにQueryExpression呼び出されるプロパティがあります (これは、特に多くのフィールドを持つエンティティの場合、パフォーマンスに違いをもたらす可能性があります)。ColumnSet

あなたの場合、次のように設定されている可能性があります。

QueryExpression qryAccounts = new QueryExpression("account")
{
    ColumnSet = new ColumnSet("accountid", "name", "primarycontactid")
};

qryAccounts.Criteria.AddCondition("primarycontactid", ConditionOperator.NotNull);

qryAccounts.AddLink("list", "accountid", "entityid");


EntityCollection collAccounts = svcOrganization.RetrieveMultiple(qryAccounts);

ここで、返されたレコードのいずれかにcollAccounts.Entities主要な連絡先がある場合 (この場合は、それが条件の 1 つ、別名句であるため、すべての連絡先になりますselect)、そのAttributesコレクションには keyed のアイテムが含まれprimarycontactid、値のタイプは になりますEntityReference

これには、IdLogicalName(これは参照されるエンティティの名前、この場合は「連絡先」) およびName、エンティティのプライマリ名属性の値があります。for contact、つまりfullname( for accountit'snameなど - 常に、それぞれのエンティティのグリッドまたはルックアップで表示される名前)。

しかし、私が言ったように、それは偶然であり、それらの連絡先レコードの他の属性については、各連絡先の ID を取得Retrieveし、私のコメントに記載されている呼び出しのいずれかを実行する必要があります。

私が覚えている限り、実際の FetchXML (結果も XML) を使用すると、リンクされたレコードの属性を直接返すことFetchできます。

于 2012-09-27T17:16:22.180 に答える