我是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。
起初,我想也许我的自定义对象的反序列化是问题所在,但是我使用机会做了一个非常类似的事情,它运行得很好,自动转换为该自定义对象。这让我相信我对内部查询的处理方式不正确,我会非常感谢任何方向。
这是我读过和尝试过的内容的简短摘要:
提前谢谢!
答案 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/等工具为您创建模型。