0

CRM 2011 を使用しており、EntityA (マスター) と EntityB (詳細) の間に 1 対 n の関係があります。EntityB レコードに関連していない EntityA レコードのリストを取得する必要があります。クエリ式を使用してプラグイン内でこれを達成するにはどうすればよいですか?

4

1 に答える 1

1

私はこれがうまくいくと信じています(編集を参照してください、うまくいきません):

var qe = new QueryExpression("entitya");
var entityBLink = qe.AddLink("entityb", "entityaid", "entityaid", JoinOperator.LeftOuter);
entityBLink.LinkCriteria.AddCondition("entitybid", ConditionOperator.Null);

次のような SQL ステートメントを作成する必要があります。

SELECT 
FROM entitya
LEFT OUTER JOIN entityb on entitya.entityaid = entityb.entityaid
    AND ( entityb.entitybid IS NULL ) 

編集 - 作業バージョン

var qe = new QueryExpression("entitya");
var entityBLink = qe.AddLink("entityb", "entityaid", "entityaid", JoinOperator.LeftOuter);
entityBLink.Columns.AddColumn("entitybid");
var entities = service.RetrieveMultiple(qe).Entities.
    Where(e => !e.Attributes.Keys.Any(k => k.EndsWith(".entitybid"))).
    Select(e => e.ToEntity<entitya>());

最初のクエリの SQL ステートメントはそのまま生成されますが、null チェックが結合にあり、左結合であるため、すべての EnityA エンティティが返されます。

悪いニュースは、CRM には、サブクエリを実行する方法や、リンクされたエンティティのプロパティを where 句で指定する方法がないことです。Microsoft が次のメジャー リリースでこの種の機能を追加するのに時間を割いてくれることを切に願っています。

ただし、クライアント側でフィルターを実行することはできます。これは、上記の C# コードが行っていることです。

于 2013-05-29T18:43:14.650 に答える