在微软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();