//Handles _SessionManager.IncomingRoster private void OnIncomingRosterChange(RosterChange incomingRosterChange) { //work performed in here should be done on the main GUI thread //since it will be updating the treeview this.BeginInvoke(new Session.PacketReceivedDelegate(IncomingRosterChangeThreadSafe), new object[] { incomingRosterChange }); }
public async Task <Microsoft.FSharp.Collections.FSharpList <Tuple <RosterChange, string> > > ChangesSince(string value) { using (var context = CreateContext()) { var lastVersion = int.Parse(value); var latestChanges = /* * // Not working in MySql * from change in context.RosterChanges * where change.ApplicationUserId == user.Id * where change.Version > lastVersion * group change by change.Jid into g * let latest = * (from item in g * orderby item.Version descending * select item) * .FirstOrDefault() * orderby latest.Version * select latest; * * // Not working in MySql * context.RosterChanges * .Where (c => c.ApplicationUserId == user.Id && c.Version > lastVersion) * .GroupBy (c => c.Jid) * .Select (g => g.OrderByDescending(i => i.Version).FirstOrDefault()) * .OrderBy(i => i.Version); */ from change in context.RosterChanges join gro in (from c in context.RosterChanges group c by c.Jid into g select new { Name = g.Key, MaxVer = g.Select(i => i.Version).Max() }) on change.Jid equals gro.Name where change.ApplicationUserId == user && change.Version > lastVersion && change.Version == gro.MaxVer orderby change.Version select change; var list = new List <Tuple <RosterChange, string> > (); foreach (var item in await latestChanges.ToListAsync()) { // build list RosterChange change = null; switch (item.ChangeType) { case DbChangeType.Set: var items = await(from i in context.RosterItems where i.ApplicationUserId == user where i.Jid == item.Jid select i) .FirstOrDefaultAsync(); change = RosterChange.NewSetItem(items.ToFSharp()); break; case DbChangeType.Delete: change = RosterChange.NewDeleteItem(JabberId.Parse(item.Jid)); break; default: throw new InvalidOperationException("Invalid ChangeType"); } var t = Tuple.Create(change, VersionString(item.Version)); list.Add(t); } return(ListModule.OfSeq(list)); //return null; } }