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"]);