Search code examples
facebook-c#-sdkfql.multiquery

FQL.Multiquery - query syntax when passing as parameter


Looking for a little help with a simple task...the syntax for a facebook multi-query, where you'd pass in the query as a parameter.

Here is my method:

public dynamic FBFQL(string strQuery)
    {
        try
        {
            var fb = new FacebookClient(this.FacebookAccessToken);
            //dynamic objFQL = fb.Get("fql", new { q = strQuery });
            dynamic objFQL = fb.Get("fql", new { q = new { strQuery } });

            if (objFQL == null)
            {
                return null;
            }
            else
            {
                return objFQL;
            }
        }
        catch (FacebookApiException ex)
        {
            FacebookErrorHandler(ex);
            return null;
        }
    } //FB FQL

And my query syntax"

string strQuery = "friendsMovies = \"SELECT page_id, uid FROM page_fan WHERE type='MOVIE' AND uid IN (SELECT uid2 FROM friend WHERE uid1=me()) ORDER BY page_id\"," +
" movieDetails = \"SELECT page_id, name, pic, page_url, fan_count, genre, starring, release_date FROM page WHERE page_id IN (SELECT page_id FROM #friendsMovies) ORDER BY page_id\"";

But unfortunately, it gives the following error. I've tried it several ways to no avail. I'm sure it's something simple...I just can't see it at this point.

(OAuthException - #601) (#601) Parser error: unexpected 'friendsMovies' at position 0.

Thanks in advance Chad


Solution

  • Figured it out and with named queries too:

    The Calling method and processes the result:

    public List<FacebookMovie> GetMoviesLikedByFriends()
        {
            string strQuery0 = "SELECT page_id, uid FROM page_fan WHERE type='MOVIE' AND uid IN (SELECT uid2 FROM friend WHERE uid1=me()) ORDER BY page_id";
            string strQuery1 = "SELECT page_id, name, pic, page_url, fan_count, genre, starring, release_date FROM page WHERE page_id IN (SELECT page_id FROM #friendsMovies) ORDER BY page_id";
    
            Dictionary<string, object> dicQuery = new Dictionary<string, object>();
            dicQuery.Add("friendsMovies", strQuery0);
            dicQuery.Add("movies", strQuery1);
    
            FacebookSDKInterface objFQL = new FacebookSDKInterface();
            dynamic objMoviesFriendsLike = objFQL.FBMFQL(dicQuery);
    
            //To access a direct value: resultsMQFQL.data[0].fql_result_set[0].page_id
    
            if (objMoviesFriendsLike != null) // shouldn't you check objFNU for being null here instead?
            {
                IEnumerable<dynamic> friendsMovies = (IEnumerable<dynamic>)objMoviesFriendsLike.data[0].fql_result_set; // explicit cast might not be necessary
                IEnumerable<dynamic> movieDetails = (IEnumerable<dynamic>)objMoviesFriendsLike.data[1].fql_result_set; // explicit cast might not be necessary
    
                IEnumerable<FacebookMovie> objMyFriendsMovies = 
                    from Movie in movieDetails
                    join FriendsMovies in friendsMovies on (string)Movie.page_id equals (string)FriendsMovies.page_id
                    group FriendsMovies by new
                    {
                        ID = Movie.movie_id,
                        Link = Movie.page_url,
                        MovieName = Movie.name,
                        TotalLikes = Movie.fan_count,
                        Genre = Movie.genre,
                        Starring = Movie.starring,
                        ReleaseDate = Movie.release_date,
                        PicURL = Movie.pic
                    } into grp
                    where grp.Count() >= 2 //at least 2 friends must have liked it to show up
                    select new FacebookMovie()
                    {
                        Source = "Facebook",
                        ID = (string)grp.Key.ID,
                        SourceURL = (string)grp.Key.Link,
                        Name = (string)grp.Key.MovieName,
                        Picture = (string)grp.Key.PicURL,
                        TotalLikes = (long)grp.Key.TotalLikes,
                        Genre = (string)grp.Key.Genre,
                        Starring = (string)grp.Key.Starring,
                        ReleaseDate = (string)grp.Key.ReleaseDate,
                        FriendLikes = (int)grp.Count()
                    };
    
                objMyFriendsMovies = objMyFriendsMovies.OrderByDescending(p => p.FriendLikes);
    
                return objMyFriendsMovies.ToList();
            }
            else
            {
                return new List<FacebookMovie>();
            }
        }
    

    The method to perform the query:

    public dynamic FBMFQL(Dictionary<string, object> dicQuery)
        {
            try
            {
                var fb = new FacebookClient(this.FacebookAccessToken);
                dynamic objFQL = fb.Get("fql", new { q = dicQuery });
    
                if (objFQL == null)
                {
                    return null;
                }
                else
                {
                    return objFQL;
                }
            }
            catch (FacebookApiException ex)
            {
                FacebookErrorHandler(ex);
                return null;
            }
        } //FB FQL