I don't know what could be happening to your To_Id and From_Id columns, but if you want to eager-load the Users rows, you need to add With clauses:
dynamic sender;
dynamic recipient;
var messages= db.Messages.All(db.Messages.To_Id == currentUser.Id || db.Messages.From_Id == currentUser.Id)
.Join(db.Users.As("Sender"), out sender).On(sender.Id == db.Messages.From_Id)
.Join(db.Users.As("Recipient"), out recipient).On(recipient.Id == db.Messages.To_Id)
.With(sender)
.With(recipient);
return messages;
As for the missing columns, have you tried looking at the Trace to see the SQL that's being executed for the query? That might help to shed some light.