在Facebook C#SDK v6中访问查询结果

时间:2012-06-26 18:53:03

标签: facebook-c#-sdk

在以前的版本中,我能够使用以下方法从查询中检索结果:

            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()是正确的。

2 个答案:

答案 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