在以前的版本中,我能够使用以下方法从查询中检索结果:
var facebookClient = new Facebook.FacebookClient(accessToken);
const string fqlQuery = "select pic_big from user where uid=me()";
dynamic result = facebookClient.Query(fqlQuery);
var profilePhotoUrl = result[0].pic_big.ToString();
在版本6中,我可以完成相同的操作,但使用:
var facebookClient = new Facebook.FacebookClient(accessToken);
const string fqlQuery = "select pic_big from user where uid=me()";
dynamic result = facebookClient.Get("fql", new { q = fqlQuery });
var profilePhotoUrl = result.data[0].pic_big.ToString(); //v6.0 requires us to add ".data[0]" field
新方法有效,但我只想确保:result.data[0].pic_big.ToString()
是正确的。
答案 0 :(得分:1)
是的,您的新通话包括数据属性是正确的。我不确定改变背后的原因。包括数据属性模仿结果的JSON结构更准确,但因为我不知道数据元素是否已经存在。
无论如何:使用数据属性是从现在开始的方式!
答案 1 :(得分:1)
以下是您在v6中需要.data
的原因的说明。
在v5中,我们使用rest api for fql,因为它还没有在图api中可用。 Rest api没有包裹data
所以你永远不必使用.data
。在v5的一些更高版本中,当fb宣布使用图形api支持fql时,我们使用了移动到图形api,但是为了避免破坏v5中的更改,sdk在将结果返回给用户之前在内部删除了.data
(丑陋的黑客) )。
当fql使用graph api时,v5的工作原理如下。
public virtual object Query(string fql)
{
if (string.IsNullOrEmpty(fql))
throw new ArgumentNullException("fql");
var parameters = new Dictionary<string, object>();
parameters["q"] = fql;
// when using graph api
var result = (IDictionary<string, object>)Get("fql", parameters);
return result["data"];
/*
// when using rest api
var parameters = new Dictionary<string, object>();
parameters["query"] = fql;
parameters["method"] = "fql.query";
return Get(parameters);
*/
}
因此用户甚至不知道这种透明度。由于v6是一个主要版本,我们删除了Query
,因为这个丑陋的黑客解决方法。使用fql的唯一方法是通过调用正常的get。由于这会返回fb给出的确切结果,因此您需要包含.data
。