Sto scrivendo un'API per gestire genericamente Rest. Sto avendo qualche problema nel caricare entità dipendenti. Sto usando .Net-Core 2.0
Sto cercando di afferrare l'ultimo messaggio per ogni conversazione. Ho un metodo per caricare un elenco di conversazioni che sembra così:
[HttpGet("Convo")]
public async Task<Conversation[]> LoadConversation()
{
var query = this._context.Conversations.OrderBy(x => x.Id);
var messages = await query.Select(x => x.Messages.OrderBy(m =>
m.Created).FirstOrDefault())
.ToArrayAsync();
var conversations = await query.ToArrayAsync();
return conversations;
}
Quando controllo i messaggi, ho un messaggio il cui ID di conversazione è 3011, quando controllo le conversazioni, ho un ID caricato di 3011. Eppure, la conversazione. I messaggi sono ancora vuoti.
EDIT Ho anche provato a caricarli usando una selezione anonima, che ancora non ha mappato nessuno dei due
var convo = await query.Select(x => new {
Conversation = x,
Message = x.Messages.OrderBy(m => m.Created).FirstOrDefault()
}).ToArrayAsync();
NOTA
Se includo tutti i miei messaggi, vengono mappati correttamente
var conversationWithAllMessages = await query.Include(x => x.Messages).ToArrayAsync();
Funzionano anche se chiamo SelectMany sull'intera collezione
var messages = query.SelectMany(x => x.Messages)
.OrderBy(x => x.ConversationId)
.ToArray();
Ma voglio solo includere l'ultimo messaggio
MODIFICARE
Perché la mappatura delle entità non è mia, Come posso ottenere che le mie entità siano mappate in modo appropriato?
Penso che quello che sta succedendo è che, EFCore si aspetta una collezione o IEnumerable per poter mappare alla proprietà Collection della mia entità padre
Sembra che questo sia un bug con EF-Core. Forse sto trascurando le specifiche e solo le collezioni dovrebbero mappare le collezioni? Come soluzione, ho risolto questo problema con SelectMany e Take.
var messages = query.SelectMany(x => x.Messages.OrderBy(m => m.Created).Take(1))
.OrderBy(x => x.ConversationId)
.ToArray();
È possibile forzare include con questa sintassi
var query = this._context.Conversations.Include("Messages").OrderBy(x => x.Id);