Включить и выбрать не работают вместе.
Вы говорите DataContext вернуть переменную сообщения, которая содержит только сообщение (даже если у вас есть операторы include для объекта context.Messages).Это можно исправить двумя способами:
1) Сообщение проекта, Вложения, Аутентификация в объекте POCO в вашем операторе select
var result = (from message in context.Messages
.Include("Attachments")
.Include("Authentication")
join authentication in context.Authentications on message.Authentication.AuthenticationId equals authentication.AuthenticationId
where authentication.AuthorizationKey == authorizationKey
select new MessageWithNavigations()
{
Message = message,
Authentication = message.Authentication,
Attachments = message.Attachments,
}).FirstOrDefault();
return result;
2) Использовать беглую нотацию для всего запрашиваемого
var result = context.Messages
.Include("Attachments")
.Include("Authentication")
.Where(m => m.Authentication.AuthorizationKey == authorizationKey)
.FirstOrDefault();
Проблема с # 1 заключается в том, что вы не сможете ничего сделать с экземплярами объекта, который бы инициировал запрос (например, с навигацией), или изменить какие-либо свойства этих объектов.Проекция предоставляет только объекты, доступные только для чтения.
С # 2 может быть лучше использовать .SingleOrDefault вместо FirstOrDefault, если ваш AuthorizationKey является уникальным значением / первичным ключом.
Сутьпроблема в том, что использование include с select в одном и том же объекте IQueryable существенно сбивает с толку дерево выражений построителя запросов и игнорирует ваши операторы include.