我正在编写一个用于一般处理Rest的API。我在加载依赖实体时遇到了一些麻烦。我正在使用.Net-Core 2.0
我正试图抓住每个对话的最后一条消息。我有一个加载会话列表的方法,如下所示:
[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;
}
当我查看邮件时,我的邮件的会话ID为3011, 当我检查对话时,我有一个ID为3011的Id.然而,对话。消息仍然是空的。
修改 我还试图使用匿名选择加载它们,它仍然没有映射
var convo = await query.Select(x => new {
Conversation = x,
Message = x.Messages.OrderBy(m => m.Created).FirstOrDefault()
}).ToArrayAsync();
注意
如果我收录了所有邮件,那么它们就会很好地映射
var conversationWithAllMessages = await query.Include(x => x.Messages).ToArrayAsync();
如果我在整个集合中调用SelectMany
,它们也可以工作var messages = query.SelectMany(x => x.Messages)
.OrderBy(x => x.ConversationId)
.ToArray();
但我只想包含最后一条消息
修改
为什么我的实体不能映射,如何让我的实体正确映射?
答案 0 :(得分:1)
您可以使用此语法强制包含
var query = this._context.Conversations.Include("Messages").OrderBy(x => x.Id);
答案 1 :(得分:1)
我认为发生的事情是,EFCore期望Collection或IEnumerable能够映射到我父实体的Collection属性
看起来这是EF-Core的一个错误。也许我忽略了规范,只有Collections应该映射到集合?作为解决方法,我用SelectMany和Take解决了这个问题。
var messages = query.SelectMany(x => x.Messages.OrderBy(m => m.Created).Take(1))
.OrderBy(x => x.ConversationId)
.ToArray();