如何将SOQL内部查询作为强类型对象(C#)

时间:2015-01-06 17:04:53

标签: c# salesforce soql

我是Salesforce开发的新手,并试图找出SOQL的东西。长时间听众,第一次来电。

我在ActivityHistories上运行SOQL查询,并尝试将其作为自定义对象。我需要这样做,所以我可以将数据绑定到ASP.Net数据网格。不幸的是,动态类型对我来说不起作用,因为我无法将其绑定到网格。

这是我的问题:

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 绑定到datagrid时,我根本就没有数据。列的标题出现,但我没有得到任何应该在那里的记录。即使调试也没有提供任何其他信息,它看起来就像我有一个空白对象。但是,当我运行相同的查询并将活动替换为动态时,我会得到一大堆包含我正在寻找的所有内容的Json。

起初,我想也许我的自定义对象的反序列化是问题所在,但是我使用机会做了一个非常类似的事情,它运行得很好,自动转换为该自定义对象。这让我相信我对内部查询的处理方式不正确,我会非常感谢任何方向。

这是我读过和尝试过的内容的简短摘要:

提前谢谢!

2 个答案:

答案 0 :(得分: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");

答案 1 :(得分:1)

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