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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章