public IEnumerable <FbMessage> GetMessages(FbMessageFolder folder) { Authenticate(); string call_id = GetNextCallNr(); var query = new StringBuilder(); query.Append("{"); query.Append("\"threads\":\"SELECT thread_id, subject, recipients, updated_time, parent_message_id, parent_thread_id, unread FROM thread WHERE folder_id = 0\","); query.Append("\"messages\":\"SELECT thread_id, body, author_id, created_time, attachment FROM message WHERE thread_id IN (SELECT thread_id FROM #threads)\","); query.Append("\"users\":\"SELECT uid, name FROM user WHERE uid IN (SELECT author_id FROM #messages)\""); query.Append("}"); Dictionary <string, string> requestParams = new Dictionary <string, string>(); requestParams.Add("method", "fql.multiquery"); requestParams.Add("api_key", apiKey); requestParams.Add("session_key", sessionKey); requestParams.Add("call_id", call_id); requestParams.Add("v", "1.0"); requestParams.Add("queries", query.ToString()); var result = channel.ExecuteMultiQueries(apiKey, sessionKey, call_id, GenerateSignature(requestParams, sessionSecret), query.ToString()); XNamespace ns = result.GetDefaultNamespace(); // Fire one call to retreive names for all recipients in messages var uids = result.Descendants(ns + "recipients").Elements(ns + "uid").Select(n => n.Value).ToArray(); var addresses = GetAddresses(String.Join(", ", uids)).ToList(); foreach (XElement messageElement in result.Descendants(ns + "message")) { FbMessage message = new FbMessage(); try { var threadid = messageElement.Element(ns + "thread_id").Value; var from = messageElement.Element(ns + "author_id").Value; //if (String.IsNullOrEmpty(from)) // System.Diagnostics.Debugger.Break(); // Find the associated thread which contains the subject and readstate var threadElement = result.Descendants(ns + "thread").FirstOrDefault(t => t.Element(ns + "thread_id").Value == threadid); var senderElement = result.Descendants(ns + "user").FirstOrDefault(u => u.Element(ns + "uid").Value == from); if (threadElement == null || senderElement == null) { Logger.Error("Unable to determine sender for Facebook message, ignoring", LogSource.Channel); continue; } message.ThreadId = threadid; message.Subject = threadElement.Element(ns + "subject").Value; message.Body = messageElement.Element(ns + "body").Value; message.From = new SourceAddress(senderElement.Element(ns + "uid").Value, senderElement.Element(ns + "name").Value); message.To = new SourceAddressCollection(); message.Read = threadElement.Element(ns + "unread").Value == "0"; message.DateCreated = Int64.Parse(threadElement.Element(ns + "updated_time").Value).ToUnixTime(); foreach (XElement recipientElement in threadElement.Element(ns + "recipients").Elements()) { message.To.Add(addresses.FirstOrDefault(a => a.Address == recipientElement.Value)); } message.MessageId = message.ThreadId + message.From.Address; } catch (Exception ex) { Logger.Error("Unable to retreive mesaage. Result = {0}. Exception = {1}", LogSource.Channel, messageElement.Value, ex); continue; } yield return(message); } }