2010-12-06 17 views
0

J'utilise le Facebook C# SDK dans une application de canevas.RuntimeBinderException sur Linq dynamique avec Facebook C# SDK

Lors de l'exécution de ce code ...

public IEnumerable<string> GetFansIds(string pageId, IEnumerable<string> userIds) 
{ 
    if (userIds.Count() == 0) 
     return new List<string>(); 

    var fb = new FacebookApp(); 
    string query = String.Format("select uid from page_fan where uid IN ({0}) and page_id = {1}", 
     String.Join(",", userIds), 
     pageId 
    ); 
    dynamic result = fb.Fql(query); 
    return result.Select((Func<dynamic, string>)(x => x.uid)).ToList(); 
} 

Je reçois l'exception suivante:

RuntimeBinderException: Cannot perform runtime binding on a null reference 

Le code effectue les opérations suivantes:

  • Il effectue une requête FQL à obtenir un JsonArray contenant JsonObject chacun avec une propriété uid (contenant e uides des utilisateurs qui ne sont pas fan de certaines pages de fans.

  • Le Select vient convertit tous les objets dynamiques en List<string>

La partie FQL fonctionne correctement comme je peux voir les résultats dans le débogueur. Le problème est avec le Select que je ne peux pas le faire fonctionner.

Comment réparer le lambda dynamique ??? (Ne me dites pas simplement d'utiliser un foreach, ce que je suis en train de faire en ce moment)

Répondre

1

Le problème est que les méthodes d'extension ne peuvent pas être utilisées sur des objets dynamiques. Convertissez le résultat de la requête en JsonArray, puis vous pouvez utiliser les expressions linq sur JsonArray.

var result = (JsonArray)fb.Fql(query); 
return result.Select((Func<dynamic, string>)(x => x.uid)).ToList();