2012-06-26 104 views
1

在以前的版本中,我能夠用檢索從查詢結果:訪問查詢結果

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

回答

1

是的,您的新呼叫包括數據屬性是正確的。我不確定變革背後的原因。包含數據屬性模仿結果的JSON結構更加準確,但是因爲我不知道數據元素是否已經存在。

無論如何:使用數據屬性是從現在開始的方式!

1

這裏是爲什麼你需要在第6版.data的澄清。

在v5中,我們使用fql的rest api,因爲它在圖api中尚不可用。其餘的api沒有環繞data,所以你永遠不必使用.data。在v5的某些更新版本中,當fb使用圖形API宣佈支持fql時,我們使用圖形api,但爲了避免在v5中發生突變,sdk在將結果返回給用戶(醜陋黑客)之前在內部刪除了.data

下面是當fql使用圖形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