0

我正在使用 CRM 2011,我在 EntityA(master) 和 EntityB(detail) 之间有 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 语句确实按原样生成,但由于对连接进行空检查并且它是左连接,因此返回所有 EnityA 实体。

坏消息是在 CRM 中无法执行子查询,或在 where 子句中指定链接实体的属性。我真的希望微软花一些时间在下一个主要版本中添加这种类型的功能。

但是,您可以在客户端执行过滤器,这就是上面的 C# 代码所做的。

于 2013-05-29T18:43:14.650 回答