如何找到(最好使用CRM Linq)有0个孩子的父实体。例如,如何找到所有具有0个联系人的帐户。
答案 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服务器以执行;这应该使代码的执行更快。