1

私はQueryExpressionを頻繁に使用していますが、これまでのところ、これは単純に get-this-from-that または put-this-in-that でした。最近、LinkedEntityというものがあることを知り、探し始めました。例として、SO に関する関連する質問に触発され、GUID を指定してリストのすべてのメンバーを取得するための式を作成し始めました。

ただし、私が見つけたすべての例は、この例が示すように同じパターンに従います。この質問から、それが時代遅れのアプローチ (CRM 4.0) であることを知りました。より最新の例を見つけることができず、リンケージを設計する方法がわかりません。

サンプルコードを提供してくれる人はいますか?

Guid guid = ...;
QueryExpression request = new QueryExpression
{
  EntityName = "account",
  ColumnSet = new ColumnSet(true),
  LinkEntities= ???,                        // How to link the entities correctly?
  Criteria = new FilterExpression { ??? }   // How to filter for *guid* only?
};

2 つのエンティティをリンクする fetch-XML を作成しましたが、それをQueryExpressionエンティティに変換する方法がわかりません。私はこのようなものを持っています。助言がありますか?

LinkEntity linkListToMember = new LinkEntity(
  "list", "listmember", "listid", "listid", JoinOperator.Natural);
LinkEntity linkMemberToContact = new LinkEntity(
  "listmember", "account", "entityid", "accountid", JoinOperator.Natural);
4

2 に答える 2

1

リンク エンティティは、SQL 結合として機能します。from および to のエンティティ名と属性名でコンストラクターを使用する

public LinkEntity(
    string linkFromEntityName, // This is the Entity Logical Name of your Query Expression, or parent LinkEntity
    string linkToEntityName, // This is the Entity Logical Name of the entity you'd like to link to
    string linkFromAttributeName, // This is the attribute name on your from entity, containing your join key
    string linkToAttributeName, // This is the attribute name on your to entity, containing your join key
    JoinOperator joinOperator) // This is the type of Join you'd like to perform

リンク エンティティを使用すると、リンク基準を追加して、返される結果をフィルタリングできます。列を追加して、関連するエンティティからデータを返すこともできます。

編集、コンラッドの回答への追加

Konrad がリストする 52 行のコードが冗長すぎると思われる場合、これは、ここで定義されている拡張メソッドを使用して、15 行でまったく同じことを行います。

Guid guid = ...;
IOrganizationService service;

QueryExpression request = new QueryExpression("account")
{
  ColumnSet = new ColumnSet("name", "region"),
};
request.Criteria.AddCondition("name", ConditionOperator.NotNull);
request.Criteria.AddCondition("region", ConditionOperator.NotNull);

var listLink = request.AddLink("listmember", "accountid", "entityid").
  AddChildLink("list", "listid");

listLink.Columns.AddColumn("listname");
listLink.LinkCriteria.AddCondition("listid", ConditionOperator.Equal, guid);
于 2013-01-14T16:25:47.960 に答える
0

GUID とサーバー接続がある場合、マーケティング リストのすべてのメンバーを取得する方法を次に示します。条件で行ったことは正しいですが、一方を他方にジャッキする必要があります。土曜日にはブログにもっと大きな説明を載せます。

Guid guid = ...;
IOrganizationService service;

QueryExpression request = new QueryExpression
{
  EntityName = "account",
  ColumnSet = new ColumnSet("name", "region"),
  LinkEntities =
  {
    new LinkEntity 
    { 
      JoinOperator = JoinOperator.Inner, 
      LinkFromEntityName = "account", 
      LinkFromAttributeName = "accountid", 
      LinkToEntityName = "listmember", 
      LinkToAttributeName = "entityid",
      LinkCriteria = { },
      LinkEntities =
      {
        new LinkEntity
        {
          JoinOperator = JoinOperator.Inner,
          Columns = new ColumnSet("listname"),
          EntityAlias = "MarketingList",
          LinkFromEntityName = "listmember",
          LinkFromAttributeName = "listid",
          LinkToEntityName = "list",
          LinkToAttributeName = "listid",
          LinkCriteria = { Conditions = 
          {
            new ConditionExpression("listid", ConditionOperator.Equal, guid) 
          } }
        }
      }
    } 
  },
  Criteria = new FilterExpression
  {
    Filters =
    {
      new FilterExpression
      {
        FilterOperator = LogicalOperator.And,
        Conditions =
        {
          new ConditionExpression("name", ConditionOperator.NotNull),
          new ConditionExpression("region", ConditionOperator.NotNull)
        }
      }
    }
  }
};

次に、もちろん、呼び出しを実行する必要があります。

EntityCollection result = service.RetrieveMultiple(request);

最後に、サーバーから取得したものは何でも順序付けて構造化したい場合があります。次の LINQ-to-Data 式を使用しています。

IEnumerable<Member> output = result.Entities.Where(element 
  => Member.IsWellFormed(element)).Select(element
    => new Member(element));

このテーマの詳細については、ブログを参照してください。

于 2013-01-15T07:20:42.630 に答える