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