在crm系统中 接口或者插件中 通常都会有查询的校验
实际上单查询的话 不用crm提供的方式也可以 直接用sql的方式去查,一般涉及到很多表的联动查询比如报表查询时,还是用sql更方便
 
一、QueryExpression查询方式
1.花挎号实例化方式,可以做多表联动查询
 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.多表查询

(简单的查询语句可以通过在线sql语句转换成fetchxml的工具转化, 也可以通过相关的实体窗体右上方导航按钮中有个高级查询 自定义一个查询视图然后导出fetchxml,较为复杂的语句建议自己写)
 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)FetchXML中的关联表查询时,过滤条件为link表的字段是,既可以写在link表里,也可以放到最外层统一过滤
下面为js中拼接的fetchXML语句
 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种查询方式的更多相关文章

  1. 【温故知新】——原生js中常用的四种循环方式

    一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出“欢迎下次光临” 在网页中弹出框输入1   网页输出“查询中……” 在 ...

  2. Vue中常用的几种传值方式

    Vue中常用的几种传值方式 1. 父传子 父传子的实现方式就是通过props属性,子组件通过props属性接收从父组件传过来的值,而父组件传值的时候使用 v-bind 将子组件中预留的变量名绑定为da ...

  3. easyui datagride 两种查询方式

    easyui datagride 两种查询方式function doReseach() { //$('#tt').datagrid('load', { // FixedCompany: $('.c_s ...

  4. Hibernate的四种查询方式(主键查询,HQL查询,Criteria查询,本地sql查询)和修改和添加

    Hibernate的添加,修改,查询(三种查询方式)的方法: 案例演示: 1:第一步,导包,老生常谈了都是,省略: 2:第二步,创建数据库和数据表,表结构如下所示: 3:第三步创建实体类User.ja ...

  5. Hibernate的Api以及三种查询方式

    Hibernate  Api |-- Configuration       配置管理类对象 config.configure();    加载主配置文件的方法(hibernate.cfg.xml) ...

  6. hibernate的三种查询方式

    hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...

  7. Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询

    HQL查询方式 这一种我最常用,也是最喜欢用的,因为它写起来灵活直观,而且与所熟悉的SQL的语法差不太多.条件查询.分页查询.连接查询.嵌套查询,写起来与SQL语法基本一致,唯一不同的就是把表名换成了 ...

  8. 初学者易上手的SSH-hibernate02 三种查询方式

    在上一章中已经搭建好了一个hibernate的环境,那么这一章我们就使用这个环境来进行基本CRUD.在这之前我们先了解一个东西:主键生成策略.就是当向数据库表中插入记录的时候,这个记录的主键该如何生成 ...

  9. JMeter常用的4种参数化方式-操作解析

    目录结构 一.JMeter参数化简介 1.JMeter参数化的概念 2.JMeter参数化方式之使用场景对比 二.JMeter参数化的4种主要方式-操作演练 1.User Parameters(用户参 ...

  10. iOS开发中数组常用的五种遍历方式

    随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...

随机推荐

  1. Linux利用crontab命令定时任务

    系统配置文件/etc 系统周期性所要执行的工作,比如写缓存数据到硬盘.日志清理等.在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件. /etc/crontab文件大概包括下面几 ...

  2. C语言模拟算法

    文章目录 1.数据结构 1.1基于数组 1.2 基于字符串 1.3基于链表 1.4基于矩阵 2.算法技巧 2.1.排序 2.2.递归 2.3.迭代 3.实战 3.1 力扣面试题16.01 交换数字 3 ...

  3. 需求解决 _针对特定Class设置样式 _CSS _20210906

    需求解决 _针对特定Class设置样式 _CSS _20210906 有一个需求,需要对一些具有 某个Class的标签 ,icon,以及其中的字体设置 隐藏或者展示 解决方法如下:(需要对 该页面引用 ...

  4. mysql 查询两个日期之间所有天数(查询近两个月所有日期)

    本文转自博文:https://blog.csdn.net/qq_42795259/article/details/126722209 遇到一个需求需要查询近两个月所有日期,如下图: 首先实现解决问题如 ...

  5. 推荐一个 ASP.NET Core 的轻量级插件框架

    前言 本文将介绍一个专为ASP.NET Core设计的轻量级插件框架--PluginCore,该框架不仅能够简化插件的开发与集成,还能大幅提高开发效率. 另外,还将简要介绍相关的前端技术和SDK支持, ...

  6. 每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

    前言 每次去不同的公司,码不同的代码,适应不同的规范,经常被老大教育规范问题,我都有点走火入魔的感觉,还是要去看看阿里巴巴Java开发规范,从中熟悉一下,纠正自己,码出高效,码出质量. 想细看的可以去 ...

  7. Maxima 使用教程

    说起数学软件,我们很多人脑子里浮现出的第一个就是 matlab,不可否认,matlab 确实是一个优秀的数学软件,但是它需要付费啊(这里不讨论盗版问题).那么有没有一个同样强大但免费的数学软件呢?答案 ...

  8. 基于Java+SpringBoot+Mysql实现的快递柜寄取快递系统功能实现三

    一.前言介绍: 1.1 项目摘要 随着电子商务的迅猛发展和城市化进程的加快,快递业务量呈现出爆炸式增长的趋势.传统的快递寄取方式,如人工配送和定点领取,已经无法满足现代社会的快速.便捷需求.这些问题不 ...

  9. 使用wxpython开发跨平台桌面应用,基类列表窗体的抽象封装处理

    在开发一套系统框架的时候,除了关注实现系统的功能实现外,我们对于系统的各个方面都是应该精益求精,以最少的编码做最好的事情,在开发的各个层次上,包括前端后端,界面处理.后端处理.常用辅助类.控件封装等等 ...

  10. Docker配置Trojan代理

    1.遇到的问题 在做云计算作业,使用阿里云的ECS服务器尝试使用docker拉取镜像的时候,发现一直无法从仓库拉取,更换了多个镜像源也没有解决问题,于是决定学会去配置linux的代理,记录过程. 2. ...