如何将 SOQL 内部查询获取为 strongly-typed object (C#)

How to get SOQL inner query as strongly-typed object (C#)

我是 Salesforce 开发的新手,正在尝试弄清楚 SOQL 的东西。长期听众,第一次来电。

我正在 运行对 Activity 历史记录进行 SOQL 查询,并尝试将其作为自定义 object。我需要这样做,以便可以将数据绑定到 ASP.Net 数据网格。不幸的是,dynamic 类型对我不起作用,因为我无法将其绑定到网格。

这是我的查询:

var activities = await client.QueryAsync<Activity>(@"SELECT (SELECT ActivityDate, Description 
FROM ActivityHistories
ORDER BY ActivityDate DESC NULLS LAST, LastModifiedDate DESC LIMIT 500)
FROM Account
WHERE Id = '" + SalesforceId + "' LIMIT 1");

这是我要使用的自定义数据类型

public class Activity
    {
        public DateTime ActivityDate { get; set; }
        public string Description { get; set; }
    }

当我 运行 此请求并将 activities.records 绑定到数据网格时,我根本没有得到任何数据。列的 headers 出现,但我没有得到任何应该存在的记录。即使调试也没有提供任何附加信息,看起来我得到了一个空白 object 。但是,当我 运行 相同的查询并将 Activity 替换为 dynamic 时,我得到一大堆 Json 确实包含我正在寻找的所有内容。

起初,我认为可能反序列化到我的自定义 object 中是问题所在,但我对 Opportunity 做了非常相似的事情,而且效果很好,自动转换为该自定义 object。这让我相信我错误地处理了内部查询的某些东西,我将不胜感激任何方向。

以下是我阅读和尝试过的内容的简短摘要:

提前致谢!

在幕后,Salesforce API 是 JSON 服务的集合。 DeveloperForce 工具包(您似乎正在使用)在结果对象中没有看到与返回的 JSON 对象相匹配的结构。这是因为嵌套查询 returns 一个对象里面有多层嵌套对象。像这样:

  • 查询结果
    • 帐号
      • Activity 历史查询的结果
        • Activity 历史记录列表

序列化库已经为您处理了第一级和第二级。您现在必须提供一个要反序列化的对象,该对象可以容纳第三和第四级别。

我用类似的代码做了一些测试,发现像这样的层次结构应该可以工作:

public class ActivityQueryContainer
{
    public Dictionary<string, string> Attributes { get; set; }
    public ActivityHistoryResult ActivityHistories { get; set; }
}

public class ActivityHistoryResult
{
    public Activity[] Records { get; set; }
}

public class Activity
{
    public DateTime ActivityDate { get; set; }
    public string Description { get; set; }
}

然后您可以将 API 调用更改为如下所示:

var activities = await client.QueryAsync<ActivityQueryContainer>(@"SELECT (SELECT 
    ActivityDate, Description FROM ActivityHistories ORDER BY ActivityDate DESC NULLS LAST, 
    LastModifiedDate DESC LIMIT 500) FROM Account WHERE Id = '" + SalesforceId + "' LIMIT 1");

您始终可以将结果转换为类型 "object",这将 return 为 JSON 字符串,使用 http://json2csharp.com/ 等工具为您创建模型.