Dynamic CRM最常用的3种查询方式
1 private static Entity GetDeliveryOrderDetail(string deliveryOrderNo, string deliveryRowNo)
2 {
3 QueryExpression queryExp = new QueryExpression("foton_deliveryorderdetail")
4 {
5 ColumnSet = new ColumnSet("foton_deliveryorderdetailid"),
6 NoLock = true,
7 Criteria = new FilterExpression(LogicalOperator.And)
8 {
9 Conditions =
10 {
11 new ConditionExpression("foton_rowno", ConditionOperator.Equal, deliveryRowNo)
12 }
13 },
14 LinkEntities =
15 {
16 new LinkEntity("foton_deliveryorderdetail", "foton_deliveryorder", "foton_deliveryorderid", "foton_deliveryorderid", JoinOperator.Inner)
17 {
18 LinkCriteria = new FilterExpression(LogicalOperator.And)
19 {
20 Conditions =
21 {
22 new ConditionExpression("foton_no", ConditionOperator.Equal, deliveryOrderNo),
23 new ConditionExpression("crm_orderlinestatus",ConditionOperator.NotEqual,171060003),
24 }
25 }
26 }
27 }
28 };
29
30 Entity deliveryOrderDetail = null;
31 try
32 {
33 deliveryOrderDetail = OrgServiceUtil.Client.RetrieveMultiple(queryExp).Entities.FirstOrDefault();
34 }
35 catch (Exception e)
36 {
37 return null;
38 }
39 return deliveryOrderDetail;
40 }
2.属性赋值方式,看起来更整洁一些,个人比较常用此方式
1 private Entity checkAccountAmountIsExist(IOrganizationService service,Entity entity)
2 {
3 QueryExpression query = new QueryExpression(AccountAmount.new_amount);
4 query.Criteria.AddCondition("new_account_amount", ConditionOperator.Equal, entity.GetAttributeValue<EntityReference>("new_account_amount").Id);
5 query.Criteria.AddCondition("new_type", ConditionOperator.Equal, entity.GetAttributeValue<OptionSetValue>("new_type").Value);
6 query.ColumnSet = new ColumnSet(true);
7 query.NoLock = true;
8 Entity checkEntity = service.RetrieveMultiple(query)?.Entities.FirstOrDefault();
9 return checkEntity;
10 }
项目实战拓展:QueryExpression多选项集条件查询与多条件组合查询方式:
1 public List<Entity> GetOldFundsAccountByBusinessId(string businessEntityName, Guid businessId)
2 {
3 QueryExpression query = new QueryExpression(FundsAccount.new_funds_account);
4 switch (businessEntityName)
5 {
6 case FundsAccount.new_order:
7 query.Criteria.AddCondition(FundsAccount.new_order_field, ConditionOperator.Equal, businessId);
8 break;
9 case FundsAccount.new_salesorder:
10 query.Criteria.AddCondition(FundsAccount.new_partssalesorder_field, ConditionOperator.Equal, businessId);
11 break;
12 default:
13 break;
14 }
15 int[] typeArray = { FundsAccountType.BALANCE.GetHashCode(), FundsAccountType.BEGINBALANCE.GetHashCode(), FundsAccountType.LC.GetHashCode(), FundsAccountType.LINECREDIT_REMOVE_OUT.GetHashCode(), FundsAccountType.LINECREDIT_REMOVE_INNER.GetHashCode() };
16 ConditionExpression condition = new ConditionExpression("new_type", ConditionOperator.In, typeArray);
17 FilterExpression filter = new FilterExpression();
18 filter.AddCondition(condition);
19 query.ColumnSet = new ColumnSet(true);
20 query.NoLock = true;
21 query.Criteria.AddFilter(filter);
22 return crmOrg.RetrieveMultiple(query)?.Entities.ToList();
23 }
二、FetchXML查询方式
FetchXML查询方式个人使用最多的场景是多表联动查询
1.简单单表查询
1 private static Entity GetPurchasingInfoRecord(string infnr,Guid otdmaterialId, Guid providerId)
2 {
3 Entity entity = null;
4 string getOtdmaterialByCodeFetchXML = @"
5 <fetch mapping='logical'>
6 <entity name='foton_otdpurchasinginforecord'>
7 <all-attributes />
8 <filter type='and'>
9 <condition attribute='foton_infnr' operator='eq' value='{0}' />
10 <condition attribute='foton_otdmaterialid' operator='eq' value='{1}' />
11 <condition attribute='foton_providerid' operator='eq' value='{2}' />
12 </filter>
13 </entity>
14 </fetch>";
15 string fetchXml = string.Format(getOtdmaterialByCodeFetchXML, infnr, otdmaterialId.ToString().Replace("{","").Replace("}", ""), providerId.ToString().Replace("{", "").Replace("}", ""));
16 EntityCollection entities = ExecFetchXML(fetchXml);
17 if (entities.Entities.Count > 0)
18 {
19 entity = entities[0];
20 }
21 return entity;
22 }
23
24 /// <summary>
25 /// 根据FetchXML查询对应的Entity列表
26 /// </summary>
27 /// <param name="fetchXml">fetchxml查询语句</param>
28 /// <create>ading</create>
29 /// <returns>结果集</returns>
30 public static EntityCollection ExecFetchXML(string fetchXml)
31 {
32 try
33 {
34 return crmOrg.RetrieveMultiple(new FetchExpression(fetchXml));
35 }
36 catch (Exception ex)
37 {
38 if (ex is MessageSecurityException)
39 {
40 crmOrg = OrgServiceUtil.Client;
41 return crmOrg.RetrieveMultiple(new FetchExpression(fetchXml));
42 }
43 throw ex;
44 }
45 }
2.多表查询
1 /// <summary>
2 /// 税率查询FetchXML
3 /// </summary>
4 private string RateQueryFetchXML = @"
5 <fetch mapping='logical'>
6 <entity name = 'new_product_fourth'>
7 <link-entity name='new_return_analysis_detail' from='new_product_fourthid' to='new_product_fourthid' alias='analydetail' link-type='inner'>
8 <filter>
9 <condition attribute = 'new_return_analysis_detailid' operator='eq' value='{0}' />
10 </filter>
11 </link-entity>
12 <link-entity name='new_brand' from='new_brandid' to='new_brandid' link-type='outer' alias='brand'>
13 <attribute name='new_taxrate' />
14 </link-entity>
15 </entity>
16 </fetch>";
17 要取出连接表中的new_taxrate字段的值 需要注意要用AliasedValue先承接连接表的查询结果
18 private decimal GetRateByDetail(IOrganizationService service, Entity detailEntity)
19 {
20 decimal rate = 0.00m;
21 Entity rateEntity = service.RetrieveMultiple(new FetchExpression(string.Format(RateQueryFetchXML, detailEntity.Id)))?.Entities.FirstOrDefault();
22 AliasedValue rateAliasedValue = rateEntity.GetAttributeValue<AliasedValue>("brand.new_taxrate");
23 rate = rateEntity == null ? 0.00m : (rateAliasedValue == null ? 0.00m: Convert.ToDecimal(rateAliasedValue.Value));
24 return rate;
25 }
26 brand.new_taxrate取值,实际上也可以通过设置连接表要查的字段一个别名的方式,rateEntity.GetAttributeValue<AliasedValue>("taxrate");:
27 <attribute name='new_taxrate' alias='taxrate' />
拓展:
1 function getInvoiceDetailByOrderIdFetchXML(value) {
2 var fetchXML = '<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false">'
3 + '<entity name="new_relation">'
4 + '<all-attributes />'
5 + '<link-entity name="crm_vehicle" from="crm_vehicleid" to="crm_vin" link-type="outer" />'
6 + '<link-entity name="crm_ordermanage" from="crm_ordermanageid" to="crm_ordermanage" link-type="outer" />'
7 + '<filter type="and">'
8 + '<condition entityname="crm_ordermanage" attribute="crm_ordermanageid" value="' + value + '" operator="eq" />'
9 + '<condition entityname="crm_vehicle" attribute="crm_invoiceapplicationdetail" operator="not-null"/>'
10 + '<condition attribute="crm_orderlinestatus" value="171060003" operator="ne" />'
11 + '</filter>'
12 + '</entity >'
13 + '</fetch >';
14 return fetchXML;
15 }
三、QueryByAttribute方式:
QueryByAttribute queryo = new QueryByAttribute("opportunityproduct");
queryo.AddAttributeValue("foton_otddemandorerid", opportunityid.Id);
queryo.ColumnSet = new ColumnSet(true);
//queryinvoiceaccount.AddAttributeValue("statecode", 0);//属性名
EntityCollection ecinvoiceo = service.RetrieveMultiple(queryo);
通过字段值的方式,有些类似于QueryExpression使用属性赋值查询。
Dynamic CRM最常用的3种查询方式的更多相关文章
- 【温故知新】——原生js中常用的四种循环方式
一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0 网页输出“欢迎下次光临” 在网页中弹出框输入1 网页输出“查询中……” 在 ...
- Vue中常用的几种传值方式
Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...
- easyui datagride 两种查询方式
easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...
- Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加
Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...
- Hibernate的Api以及三种查询方式
Hibernate Api |-- Configuration 配置管理类对象 config.configure(); 加载主配置文件的方法(hibernate.cfg.xml) ...
- hibernate的三种查询方式
hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...
- 初学者易上手的SSH-hibernate02 三种查询方式
在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD.在这之前我们先了解一个东西:主键生成策略.就是当向数据库表中插入记录的时候,这个记录的主键该如何生成 ...
- JMeter常用的4种参数化方式-操作解析
目录结构 一.JMeter参数化简介 1.JMeter参数化的概念 2.JMeter参数化方式之使用场景对比 二.JMeter参数化的4种主要方式-操作演练 1.User Parameters(用户参 ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
随机推荐
- idea项目提交到码云
第一步:创建一个项目 第二步:在码云上新建一个项目.[注意把使用Readme复选框取消掉] 第三步:复制gitee地址 第四步:创建本地git仓库 第五步:选择自己需要上传到码云的项目名 第六步:提交 ...
- 低功耗4G模组Air780E快速入门:使用文件系统存储温湿度数据
伙伴们,今天我们来学习合宙低功耗4G模组Air780E快速入门之使用文件系统存储温湿度数据. 一.编写脚本 1.1 准备资料 780E开发板购买链接 780E开发板设计资料 LuatOS-Air7 ...
- ubuntu卸载php8后在命令行终端上面还是显示8的版本
使用apt install了php8然后卸载后发现php -v还是8的版本,找来找去,最后发现是需要卸载sudo apt remove php8.0-cli才行 然后使用 sudo apt autor ...
- 痞子衡嵌入式:利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是利用i.MXRT10xx系列内部DCP引擎计算CRC32值时需注意数据对齐. MCU 开发里常常需要 CRC 校验来检查数据完整性,CR ...
- zookeeper 分布式锁服务
分布式锁服务在大家的项目中或许用的不多,因为大家都把排他放在数据库那一层来挡.当大量的行锁.表锁.事务充斥着数据库的时候.一般web应用很多的瓶颈都在数据库上,这里给大家介绍的是减轻数据库锁负担的一种 ...
- JAVA并发编程学习笔记之synchronized
监视器 java中同步是通过监视器模型来实现的,JAVA中的监视器实际是一个代码块,这段代码块同一时刻只允许被一个线程执行.线程要想执行这段代码块的唯一方式是获得监视器. 监视器有两种同步方式:互斥与 ...
- Dockerfile&Docker-Compose之基础
使用了很久的docker,之前却从来没有总结过, 于是开此篇来记录平常使用Dockerfile和docker-compose.yaml的点滴, 先从基础命令开始哦 [Dockerfile] Docke ...
- Java之基础语法
最近发现公司中老的项目有些是基于Java开发的, 为了更好的后期维护 不得而要好好了解一下java, 之前一直比较抵触这门语言,现在随着了解的语言(PHP,Python,golang,shell,no ...
- 使用certbot申请免费SSL证书
现在网站使用https已经成为标配,但是SSL证书最便宜的DV证书也要几百块钱一年,对于个人开发者来说很不划算.好在,我们有Let's Encrypt,它是能提供免费的SSL证书,应该也是市面上使用最 ...
- Business Object 开发
一 什么是BO BO(Business Object),封装在数据库之上,用于直接操作数据(增.删.改.查) 针对不同的BO,在安装目录下有对应的DLL文件,其中封装了BO各式针对具体的业务的方法, ...