如何将 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。这让我相信我错误地处理了内部查询的某些东西,我将不胜感激任何方向。
以下是我阅读和尝试过的内容的简短摘要:
- http://www.salesforce.com/developer/docs/api/Content/sforce_api_objects_activityhistory.htm
- https://salesforce.stackexchange.com/questions/48800/getting-object-type-not-accessible-error/56513#56513
- Salesforce Apex - Populating an object from SOQL query
- 尝试在 Activity 中填写更多字段以对应来自查询的内容
- 尝试调整字段类型以对应或不对应 Activity
- 对与将动态类型转换为强类型相关的任何内容进行广义 Google 搜索(结果并不理想)
- 在查询中请求不同的、不同的字段,但最终落在了这两个字段上,因为它们是 Salesforce 文档中的字段(link 上面的 1)
提前致谢!
在幕后,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/ 等工具为您创建模型.
我是 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。这让我相信我错误地处理了内部查询的某些东西,我将不胜感激任何方向。
以下是我阅读和尝试过的内容的简短摘要:
- http://www.salesforce.com/developer/docs/api/Content/sforce_api_objects_activityhistory.htm
- https://salesforce.stackexchange.com/questions/48800/getting-object-type-not-accessible-error/56513#56513
- Salesforce Apex - Populating an object from SOQL query
- 尝试在 Activity 中填写更多字段以对应来自查询的内容
- 尝试调整字段类型以对应或不对应 Activity
- 对与将动态类型转换为强类型相关的任何内容进行广义 Google 搜索(结果并不理想)
- 在查询中请求不同的、不同的字段,但最终落在了这两个字段上,因为它们是 Salesforce 文档中的字段(link 上面的 1)
提前致谢!
在幕后,Salesforce API 是 JSON 服务的集合。 DeveloperForce 工具包(您似乎正在使用)在结果对象中没有看到与返回的 JSON 对象相匹配的结构。这是因为嵌套查询 returns 一个对象里面有多层嵌套对象。像这样:
- 查询结果
- 帐号
- Activity 历史查询的结果
- 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/ 等工具为您创建模型.