Dynamics CRM - 在 C# Plugin 中使用 QueryExpression (分页以及联表查询)
在 C# Plugin 中,可以使用 Query Expression 來做數據查詢,由於用 Linq 來查詢時,在數據量比較大的時候,ToList() 会导致内存问题,在此我推薦使用 QueryExpression。以下為代碼示例:
1 QueryExpression q = new QueryExpression("account"); 2 q.ColumnSet = new ColumnSet(true);//要查詢的主表字段, true 代表全部,也可以逐個錄入字段 3 q.Criteria.AddCondition("name", ConditionOperator.NotNull); 4 5 //聯表查詢 6 LinkEntity linkToContact = new LinkEntity(); 7 linkToContact.LinkFromEntityName = Account.EntityLogicalName;//主表 8 linkToContact.LinkFromAttributeName = "accountid"; 9 linkToContact.LinkToEntityName = Contact.EntityLogicalName;//子表 10 linkToContact.LinkToAttributeName = "cus_account_no"; 11 linkToContact.Columns = new ColumnSet("cus_remark");//要查詢的子表字段 12 //寫法2 13 //linkToContact .Columns.AddColumn("cus_remark"); 14 linkToContact.EntityAlias = "temp";//給子表設置別名 15 linkToContact.LinkCriteria.AddCondition("statecode", ConditionOperator.Equal, 0); 16 linkToContact.JoinOperator = JoinOperator.Inner; 17 //也可添加排序,低版本sdk可能無法使用 18 linkToContact.Orders.Add(new OrderExpression("cus_record_no", OrderType.Descending)); 19 20 //分頁設置 21 PagingInfo pageInfo= new PagingInfo(); 22 pageInfo.Count = 5000;//最大值每頁5000條記錄 23 pageInfo.PageNumber = 1; 24 pageInfo.PagingCookie = null; 25 26 q.PageInfo = pageInfo; 27 while (true) 28 { 29 var resultList = service.RetrieveMultiple(q); 30 foreach (var item in resultList.Entities) 31 { 32 //do something 33 //讀取主表數據 34 string donorNo = item["cus_donor_no"].ToString(); 35 //讀取子表數據 36 string remark = ((AliasedValue)item["temp.cus_remark"]).Value.ToString(); 37 } 38 39 if (resultList.MoreRecords)//如果後續還存在記錄,則查詢下一頁,否則結束查詢 40 { 41 q.PageInfo.PageNumber++; 42 q.PageInfo.PagingCookie = resultList.PagingCookie; 43 } 44 else 45 break; 46 }