CRM Linq找到所有有0个孩子的父母

时间:2016-10-04 05:03:11

标签: linq dynamics-crm

如何找到(最好使用CRM Linq)有0个孩子的父实体。例如,如何找到所有具有0个联系人的帐户。

2 个答案:

答案 0 :(得分:2)

你要找的东西是左外连接。遗憾的是,在使用LINQ的CRM中,这是不可能的。但是,您可以使用查询表达式或FetchXML来执行此操作。

这是一个可以帮助您的链接: https://community.dynamics.com/crm/b/gonzaloruiz/archive/2014/02/23/all-about-outer-join-queries-in-crm-2011-and-crm-2013

答案 1 :(得分:2)

如果您打算使用查询表达式路由,我建议您使用以下代码

var entityAlias = "con";
var query = new QueryExpression
        {
            EntityName = "account",
            ColumnSet = new ColumnSet(true),
            Criteria =
            { 
                FilterOperator = LogicalOperator.And,
                Conditions =
                {
                    new ConditionExpression(entityAlias, "contactid",ConditionOperator.Null)
                }
            }
            LinkEntities =
            {
                new LinkEntity
                {
                    EntityAlias = entityAlias,
                    LinkFromEntityName = "account",
                    LinkFromAttributeName = "accountid",
                    LinkToEntityName = "contact",
                    LinkToAttributeName = "parentcustomerid",
                    Columns = new ColumnSet("parentcustomerid", "contactid"),
                    JoinOperator = JoinOperator.LeftOuter,
                }
            },
        };

var response = service.RetrieveMultiple(query);
var accounts = response.Entities;

在此代码中,我没有限制列,这会降低性能,您只应返回所需的列。

如果有超过5000条记录将被返回,那么您将需要使用分页并循环查询以查找所有实体, 这可以在这里找到:

https://msdn.microsoft.com/en-us/library/gg327917.aspx

但是,如果您确定要使用LINQ,则可以使用以下代码:

public static IEnumerable<Account> FindAccountsWithNoContacts()
{
   var contactRelationship = new Relationship("contact_customer_accounts");
   foreach(var account in XrmContext.AccountSet)
   {
      XrmContext.LoadProperty(contactRelationship);
      if(!account.RelatedEntities.ContainsKey(contactRelationship)
      yield return account;

   }  
}

我对LINQ代码的问题是,所有的实体,包括帐户和联系人实体,都将被加载到内存中。对于大型实体集,这可能会导致OutOfMemoryException,而查询表达式路由会将查询传递给Dynamics服务器以执行;这应该使代码的执行更快。