【问题标题】:Exclude members from a list in Dynamics CRM 4 and 2011从 Dynamics CRM 4 和 2011 中的列表中排除成员
【发布时间】:2011-09-18 19:15:34
【问题描述】:
正如标题所说,我需要从列表中排除成员。我尝试使用高级查找来提出 xml 查询,但是我没有取得太大进展。
我正在尝试做的是根据用户是否希望该操作发生在那些明确接受协议的人以及仅那些成员或第二个选项来处理列表上的操作没有明确拒绝协议的所有人,无论他们是否已经接受。
我需要查找拒绝协议的所有人并从列表中选择其他所有人。当成员拒绝协议时,将创建一个实体来反映这一点。这对那些接受协议的人很有效。但是,我无法选择没有与此实体关联的所有人。
我希望这不会太令人困惑......
【问题讨论】:
标签:
c#
list
dynamics-crm-4
crm
dynamics-crm-2011
【解决方案1】:
要在 SQL 中实现这一点,您通常会执行左外联接以将具有协议的人员组合起来,然后过滤掉具有非空协议的所有人。
当我告诉你这在 Dynamics CRM 中是不可能的时,你不会相信我。
可以进行外部联接,但需要通过导出/导入手动编辑 XML 查询。但是,由于 FetchXML 无法在顶级 <filter> 子句中引用 <linked-entity> 内部的项目,因此外连接几乎没有用处。如果您在<link-entity> 中使用<filter>,则这将转换为Join 的ON 子句,它不等同于外连接的WHERE 子句。
这是 Dynamics CRM 的一个令人震惊的遗漏。
本文底部的神秘注释试图解释这一点:http://msdn.microsoft.com/en-us/library/ms936574.aspx
【解决方案2】:
嗯,首先...令人难以置信的是为什么他们不包括从列表中排除成员的方法...我只是没有看到有什么理由吗?我无法想象有,但我仍然知之甚少......
虽然经过几次重新设计,我还是设法完成了这项工作。我们获取整个人员列表,并与拒绝的人进行外部连接,并将拒绝的日期添加到列表中。
declinedNode = entityNode.GetChildNode("link-entity", "link-entity[@name='xx_decline_{0}']".FormatWith(memberType));
declinedNode.SetAttribute("name", "xx_decline_{0}".FormatWith(memberType));
declinedNode.SetAttribute("from", "xx_parent_{0}id".FormatWith(memberType));
declinedNode.SetAttribute("to", "{0}id".FormatWith(memberType));
declinedNode.SetAttribute("link-type", "outer");
declinedNode.SetAttribute("alias", "declined");
var declinedDateNode = fetchXmlDoc.CreateNode(XmlNodeType.Element, "attribute", string.Empty);
declinedDateNode .SetAttribute("name", "xx_declineddate");
declinedNode.AppendChild(declinedDateNode);
然后服务器端已经循环遍历列表中的所有成员,所以我们只是设置一个条件,如果它具有拒绝日期的值,我们将忽略它。