1. 程式人生 > 其它 >Dynamics 365 組織服務 OrganizationService 常見的資料庫增刪改查操作

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();