我正在使用CRM 2011,我在EntityA(主)和EntityB(详细信息)之间有1-n的关系。 我需要获取与任何EntityB记录无关的EntityA记录列表。如何使用查询表达式在插件中完成此操作?
答案 0 :(得分: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子句中指定链接实体的属性。我真的希望微软花一些时间在下一个主要版本中添加这种功能。
但是,您可以在客户端执行过滤器,这就是C#代码在上面执行的操作。