Dynamics Fetch XML 实体不提供对所有属性、GUID 到 String Cast Bug 的访问
Dynamics Fetch XML Entity does not provide access to all attributes, GUID to String Cast Bug
当我将代码片段包装在 try catch 中时,出现以下异常。这会调用使用以下代码修复我的问题的错误
需要更改我将 GUID 转换为字符串的方式
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString()); // do NOT cast GUID using (string)
日志
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString()); // do NOT cast GUID using (string)
fetch system user data with idea02a959-0895-469f-ac88-bacbe0b96d11
system user entity result Dynamics.SpurGo.Gamification.DataModel.SystemUser
DONE fetch user data
getting data systemUser['spurgo_name'] = Greg Degruy
Exception System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.String'.
at Dynamics.SpurGo.Gamification.DataAccess.DynamicsDataAccess.GetSpurGoUserData()
下面我正在使用 systemuser EntityType。
我的 fetch XML 正在抓取我组织中的系统用户信息,我想从这次抓取中的实体响应中抓取的关键属性是 azureactivedirectoryobjectidGuid 属性,它是 只读
Edm.Guid。它将用于我正在构建的 Microsoft Graph API 的桥梁中。当我查询来自此提取的实体响应时,我似乎无法访问此属性。
string xml = "<fetch distinct='false' version='1.0' output-format='xml-platform' mapping='logical' no-lock='true'>" +
"<entity name='systemuser'>" +
"<attribute name='azureactivedirectoryobjectid' />" +
"<attribute name='systemuserid' />" +
"<attribute name='fullname' />" +
"<attribute name='internalemailaddress' />" +
"<filter type='and'>" +
"<condition attribute='systemuserid' operator='eq' value='{" + userId.ToString() + "}' />" +
"<condition attribute='azureactivedirectoryobjectid' operator='not - null' />" +
"<condition attribute='internalemailaddress' operator='not-null' />" +
"<condition attribute='fullname' operator='not-null' />" +
"</filter>" +
"</entity>" +
"</fetch>";
在 Fetch XML 测试器中使用 XrmToolBox 测试的结果获取响应为我提供了以下信息。
<result>
<azureactivedirectoryobjectid>{2F3EAA47-FE7F-450F-97DE-00A03BA0F9C5}</azureactivedirectoryobjectid>
<systemuserid>{EA02A959-0895-469F-AC88-BACBE0B96D11}</systemuserid>
<fullname>Greg Degruy</fullname>
<internalemailaddress>grdegr@grdegr.onmicrosoft.com</internalemailaddress>
</result>
但是在我的 C# 插件中,我使用下面的逻辑并且似乎无法访问此属性,如跟踪日志中所示。它甚至显示 crmonln 而不是 grdegr 作为我的别名。
插件跟踪日志
DONE fetch user data
user data for spurgo_name is Greg Degruy
user data for internalemailaddress is crmoln@microsoft.com
来自插件的代码片段
tracingService.Trace("fetch spurgo user data");
Entity spurGoUser = RetrieveSpurGoUser(organizationService, executionContext.UserId);
tracingService.Trace("fetch system user data");
Entity systemUser = RetrieveSystemUser(organizationService, executionContext.UserId);
tracingService.Trace("DONE fetch user data");
if (spurGoUser != null && systemUser != null)
{
spurgoUserData = new Dictionary<string, dynamic>();
spurgoUserData.Add("spurgo_name", (string)spurGoUser["spurgo_name"]);
tracingService.Trace("user data spurgo_name " + spurgoUserData["spurgo_name"]);
spurgoUserData.Add("internalemailaddress", (string)systemUser["internalemailaddress"]);
tracingService.Trace("user data internalemailaddress " + systemUser["internalemailaddress"]);
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString());
tracingService.Trace("user data azureactivedirectoryobjectid " + spurgoUserData["azureactivedirectoryobjectid"]);
spurgoUserData.Add("fullname", (string)systemUser["fullname"]);
tracingService.Trace("user data " + spurgoUserData["fullname"]);
return spurgoUserData;
}
要从 fetch XML 转换 GUID,您必须使用以下 ToString() 方法。
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString());
像这样使用 explicit 转换将不起作用。
spurgoUserData.Add("azureactivedirectoryobjectid", (string)systemUser["azureactivedirectoryobjectid"]);
当我将代码片段包装在 try catch 中时,出现以下异常。这会调用使用以下代码修复我的问题的错误
需要更改我将 GUID 转换为字符串的方式
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString()); // do NOT cast GUID using (string)
日志
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString()); // do NOT cast GUID using (string)
fetch system user data with idea02a959-0895-469f-ac88-bacbe0b96d11
system user entity result Dynamics.SpurGo.Gamification.DataModel.SystemUser
DONE fetch user data
getting data systemUser['spurgo_name'] = Greg Degruy
Exception System.InvalidCastException: Unable to cast object of type 'System.Guid' to type 'System.String'.
at Dynamics.SpurGo.Gamification.DataAccess.DynamicsDataAccess.GetSpurGoUserData()
下面我正在使用 systemuser EntityType。
我的 fetch XML 正在抓取我组织中的系统用户信息,我想从这次抓取中的实体响应中抓取的关键属性是 azureactivedirectoryobjectidGuid 属性,它是 只读 Edm.Guid。它将用于我正在构建的 Microsoft Graph API 的桥梁中。当我查询来自此提取的实体响应时,我似乎无法访问此属性。
string xml = "<fetch distinct='false' version='1.0' output-format='xml-platform' mapping='logical' no-lock='true'>" +
"<entity name='systemuser'>" +
"<attribute name='azureactivedirectoryobjectid' />" +
"<attribute name='systemuserid' />" +
"<attribute name='fullname' />" +
"<attribute name='internalemailaddress' />" +
"<filter type='and'>" +
"<condition attribute='systemuserid' operator='eq' value='{" + userId.ToString() + "}' />" +
"<condition attribute='azureactivedirectoryobjectid' operator='not - null' />" +
"<condition attribute='internalemailaddress' operator='not-null' />" +
"<condition attribute='fullname' operator='not-null' />" +
"</filter>" +
"</entity>" +
"</fetch>";
在 Fetch XML 测试器中使用 XrmToolBox 测试的结果获取响应为我提供了以下信息。
<result>
<azureactivedirectoryobjectid>{2F3EAA47-FE7F-450F-97DE-00A03BA0F9C5}</azureactivedirectoryobjectid>
<systemuserid>{EA02A959-0895-469F-AC88-BACBE0B96D11}</systemuserid>
<fullname>Greg Degruy</fullname>
<internalemailaddress>grdegr@grdegr.onmicrosoft.com</internalemailaddress>
</result>
但是在我的 C# 插件中,我使用下面的逻辑并且似乎无法访问此属性,如跟踪日志中所示。它甚至显示 crmonln 而不是 grdegr 作为我的别名。
插件跟踪日志
DONE fetch user data
user data for spurgo_name is Greg Degruy
user data for internalemailaddress is crmoln@microsoft.com
来自插件的代码片段
tracingService.Trace("fetch spurgo user data");
Entity spurGoUser = RetrieveSpurGoUser(organizationService, executionContext.UserId);
tracingService.Trace("fetch system user data");
Entity systemUser = RetrieveSystemUser(organizationService, executionContext.UserId);
tracingService.Trace("DONE fetch user data");
if (spurGoUser != null && systemUser != null)
{
spurgoUserData = new Dictionary<string, dynamic>();
spurgoUserData.Add("spurgo_name", (string)spurGoUser["spurgo_name"]);
tracingService.Trace("user data spurgo_name " + spurgoUserData["spurgo_name"]);
spurgoUserData.Add("internalemailaddress", (string)systemUser["internalemailaddress"]);
tracingService.Trace("user data internalemailaddress " + systemUser["internalemailaddress"]);
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString());
tracingService.Trace("user data azureactivedirectoryobjectid " + spurgoUserData["azureactivedirectoryobjectid"]);
spurgoUserData.Add("fullname", (string)systemUser["fullname"]);
tracingService.Trace("user data " + spurgoUserData["fullname"]);
return spurgoUserData;
}
要从 fetch XML 转换 GUID,您必须使用以下 ToString() 方法。
spurgoUserData.Add("azureactivedirectoryobjectid", systemUser["azureactivedirectoryobjectid"].ToString());
像这样使用 explicit 转换将不起作用。
spurgoUserData.Add("azureactivedirectoryobjectid", (string)systemUser["azureactivedirectoryobjectid"]);