zoukankan      html  css  js  c++  java
  • Dynamics 365 组织服务 OrganizationService 常见的数据库增删改查操作

    在微软Dynamics 365开发中使用Organization Service对数据等其他模块进行操作, 有点类似于ORM框架;

    组织服务Organization Service是客户端连接服务端的另外一种方式,它是基于WCF技术实现,数据传输采用XML,仅适用 于.NET客户端。例如:Plugin和Workflow扩展开发时,使用组织服务与服务器端进行交互。 

    通过Organization Service,开发人员可以: 

    • 对实体进行增、删、查、改、分派、共享、启用/停用
    • 执行操作
    • 执行工作流
    • 管理解决方案
    • 查询实体的元数据定义
    • 获取用户的权限

    这里简单介绍一下关于Organization Service的一些操作, 直入主题

    一. 获取实例

    跟ORM类似, 利用连接字符串获取实例

                //获取实例
                var csc = new Microsoft.Xrm.Tooling.Connector.CrmServiceClient("你的连接字符串");
                var _organizationServiceAdmina = (IOrganizationService)csc.OrganizationWebProxyClient ?? csc.OrganizationServiceProxy;

    二. 新增数据

    数据绑定的的时候有早绑定和晚绑定, 早绑定就是先定义实体, 晚绑定不定义实体, 通过属性赋值. 后面讲的都是基于晚绑定.

                //新增 在新增和修改的时候数据库是什么值,必须赋值对应的类型
                var entityCreate = new Entity("tableName");//new Entity("tableName",Guid.NewGuid());可以选择填入id
                entityCreate["stringValue"] = "abc";//字符串
                entityCreate["datetime"] = DateTime.Now;//时间
                entityCreate["moneyValue"] = new Money(3.14M);//货币
                entityCreate["intValue"] = 1;//整数类似
                entityCreate["boolValue"] = true;//bool类型
                entityCreate["floatValue"] = 3.14;//浮点型
                entityCreate["optionSetValue"] = new OptionSetValue(1);//单选类型
                entityCreate["lookupValue"] = new EntityReference("tableName_01", new Guid("EBC08060-F4F4-EB11-A12E-FA0BF8335E00"));//关联类型(lookup)
                var entityCreateId = _organizationServiceAdmin.Create(entityCreate);//返回创建的数据id

    三. 删除数据

                //删除,物理删除
                _organizationServiceAdmin.Delete("tableName", new Guid("EBC08060-F4F4-EB11-A12E-FA0BF8335E02"));

    四. 修改数据

                //更新, 在更新时建议使用这种方式, 如果将原有的数据全部查出来再修改部分字段, 会导致没有修改的字段也会被update, 可能会触发某些插件、流程
                var entityUpdate = new Entity("tableName", new Guid("EBC08060-F4F4-EB11-A12E-FA0BF8335E01"));//必须填写被更新的id
                entityUpdate["stringValue"] = "def";
                //...更新的赋值和新增一致, 不赘述
                _organizationServiceAdmin.Update(entityUpdate);

    五. 单条查询

                //查询单条: Retrieve 此方法没有找到数据会直接引发异常慎用(tableName With Id = xxx Does Not Exist), 类似.First()
                var entitySingle = _organizationServiceAdmin.Retrieve("tableName", new Guid("EBC08060-F4F4-EB11-A12E-FA0BF8335E03"), new ColumnSet("column_1", "column_2"));

    六. 多条数据查询

    连表查询也放在一起了

                //条件查询
                var queryExp1 = new QueryExpression("tableName")
                {
                    ColumnSet = new ColumnSet("column_1", "column_2")
                };
                //条件与 and
                queryExp1.Criteria.AddCondition("stringValue", ConditionOperator.Equal, "abc");//字符串相等
                queryExp1.Criteria.AddCondition("stringValue1", ConditionOperator.Like, $"%123%");//字符串模糊查询
                queryExp1.Criteria.AddCondition("datetime", ConditionOperator.LessEqual, DateTime.Now);//时间小于等于
                queryExp1.Criteria.AddCondition("intValue", ConditionOperator.In, 1, 2, 3);//int, 包含, in
                queryExp1.Criteria.AddCondition("optionSetValue", ConditionOperator.Equal, 1);//单选类型
                queryExp1.Criteria.AddCondition("boolValue", ConditionOperator.Equal, true);//bool类型
                queryExp1.Criteria.AddCondition("lookupid", ConditionOperator.Equal, "EBC08060-F4F4-EB11-A12E-FA0BF8335E03");//lookup或者主键id在查找时都可以使用字符串或者guid
                queryExp1.Criteria.AddCondition("lookupid1", ConditionOperator.Equal, new Guid("EBC08060-F4F4-EB11-A12E-FA0BF8335E03"));
                //条件或 or
                var filterExp1 = new FilterExpression(LogicalOperator.Or);
                filterExp1.AddCondition("datetime1", ConditionOperator.Last7Days);//近七天
                filterExp1.AddCondition("lookupid2", ConditionOperator.Null);//为null
                queryExp1.Criteria.AddFilter(filterExp1);//将条件附件到主查询里面
    
                //连表
                var linkExp1 = new LinkEntity("tableName", "tablebName1", "fromlookupid", "tolookupid", JoinOperator.Inner)
                {
                    EntityAlias = "a",//别名
                    Columns = new ColumnSet("column_3", "column_4"),//查询列表
                };
                linkExp1.LinkCriteria.AddCondition("statecode", ConditionOperator.Equal, 1);//组织查询条件与主查询一直, 不赘述
                queryExp1.LinkEntities.Add(linkExp1);//表示和tableName连
                //多表连
                var linkExp2 = new LinkEntity("tableName1", "tablebName2", "fromlookupid", "tolookupid", JoinOperator.LeftOuter)
                {
                    EntityAlias = "b",//别名
                    Columns = new ColumnSet("column_5", "column_6"),//查询列表
                };
                linkExp1.LinkCriteria.AddCondition("statecode", ConditionOperator.Equal, 1);//组织查询条件与主查询一直, 不赘述
                linkExp1.LinkEntities.Add(linkExp2);//表示和tableName1连
    
                //排序
                queryExp1.AddOrder("createTime", OrderType.Descending);
                //分页
                queryExp1.PageInfo = new PagingInfo
                {
                    Count = 1,//页码, 从1开始
                    PageNumber = 10,//页大小
                    ReturnTotalRecordCount = true,//是否返回总数量
                };
    
                //执行查询操作
                var entitiesQueryResult = _organizationServiceAdmin.RetrieveMultiple(queryExp1).Entities;//没有查到Entities.Count==0;
                //获取查询数据
                var entitiesObjectList = entitiesQueryResult.Select(j => new
                {
                    stringValue = j.GetAttributeValue<string>("stringValue"),//字符读取
                    moneyValue = j.GetAttributeValue<Money>("moneyValue"),//货币读取,加.Value获取decimal类型字段
                    lookupidModel = j.GetAttributeValue<EntityReference>("lookupid"),//获取关联表,实体里有Id和Name可以取值
                    optionSetModel = j.GetAttributeValue<OptionSetValue>("optionSetValue"),//获取单选项,这种只能获取到值, 获取不到具体的描述,
                    optionSetString = j.FormattedValues["optionSetValue"],//可以获取到单选项的文字描述, 但是必须要保证optionSetValue有值,否则会有异常
                    linkColum3 = j.GetAliasAttributeValue<string>("a.column_3"),//获取连表的值, 不同类型获取方式和直接取一样, 不赘述,注意两点: GetAliasAttributeValue和a.xxx
                }).ToList();
  • 相关阅读:
    Dns信息收集
    Top命令--性能
    一些php常用函数积累
    样本组成了整体,特例装裱了样本
    Android OKHttp 可能你从来没用过的拦截器 【实用推荐】
    一篇文章搞懂android存储目录结构
    [ES6 系列] 你真的了解ES6吗(一)
    撸了一个简易的工具库: jeasy
    SQL基础语句(详解版)
    状态管理之 Flux、Redux、Vuex、MobX(概念篇)
  • 原文地址:https://www.cnblogs.com/fancyblogs/p/15103632.html
Copyright © 2011-2022 走看看