EF核心加载实体不映射到查询

时间:2018-04-19 01:18:51

标签: c# linq .net-core entity-framework-core

我正在编写一个用于一般处理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();

但我只想包含最后一条消息

修改

enter image description here

为什么我的实体不能映射,如何让我的实体正确映射?

2 个答案:

答案 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();