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();
原文地址:https://www.cnblogs.com/fancyblogs/p/15103632.html