Dynamics 365 組織服務 OrganizationService 常見的資料庫增刪改查操作
阿新 • • 發佈:2021-08-05
在微軟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();