【问题标题】:How to get SOQL inner query as strongly-typed object (C#)如何将 SOQL 内部查询作为强类型对象(C#)
【发布时间】:2015-01-06 17:04:52
【问题描述】:

我是 Salesforce 开发的新手,并试图弄清楚 SOQL 的东西。长期倾听,第一次来电。

我正在对 ActivityHistories 运行 SOQL 查询,并尝试将其作为自定义对象获取。我需要这样做,以便将数据绑定到 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 绑定到数据网格时,我根本没有得到任何数据。列的标题出现,但我没有得到任何应该存在的记录。即使调试也没有提供任何额外的信息,它看起来就像我得到了一个空白对象。但是,当我运行相同的查询并将 Activity 替换为 dynamic 时,我会得到一大堆 Json,其中包含我正在寻找的所有内容。

起初,我认为反序列化到我的自定义对象可能是问题,但我用 Opportunity 做了一个非常相似的事情,它工作得很好,自动转换为那个自定义对象。这让我相信我正在错误地处理内部查询的某些事情,我将非常感谢任何方向。

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

提前谢谢你!

【问题讨论】:

    标签: c# salesforce soql


    【解决方案1】:

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

    • 查询结果
      • 帐户
        • 活动历史查询结果
          • 活动历史记录列表

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

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

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

    【讨论】:

      【解决方案2】:

      您始终可以将结果转换为将返回 JSON 字符串的“对象”类型,使用 http://json2csharp.com/ 等工具为您创建模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多