2016-11-10 31 views
1

我有两个实体之间的一对多关系:用户(一)有消息(很多)集合。
需要显示一些关于用户的信息,同时需要加载单个消息。 我尝试这样做:EF Core:如何从collection-nav属性加载单个项目?

mycontext.Users.Where(..).Include(user => user.Messages.Take(1).First()); 

然而这个代码抛出ecxeption

InvalidOperationException异常:属性表达“用户=> {从 消息M在[聊天] .Messages选择 [米] => Take(1)=> First()}'无效。表达式应为 表示属性访问:'t => t.MyProperty'。有关包括相关数据的更多信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=746393

我该如何解决?

回答

0

你不能这样做你已经尝试过。你必须从数据库中检索所有相关的消息,然后将其过滤到内存(IEnumerable)上,如下所示。

var useList= mycontext.Users.Where(..).Include(user => user.Messages); 

foreach (var u in useList) 
    { 

     var message= u.Messages.Take(1).First(); 

    } 
+0

好,但我想改变它一点:
'的foreach(VARÚ在useList) { 消息MSG =等待_context.Messages.Where(MS => ms.UserID == u.ID)。拿(1)。 FirstAsync(); u.Messages.Add(msg); }' 这种方法使得使用异步代码。 – Mergasov

+1

错误:正好相反。加载消息**和它是相关的用户** –

1

很容易。而不是试图从用户加载的消息,从消息加载用户:

mycontext.Messages.Where(..).Include(msg => msg.User); 

事实上,你可以做你更容易:

mycontext.Messages 
.Include(msg => msg.User) 
.Where(msg => msg.User...); 

所以你不必上消息过滤器,而不是在用户

+0

是的,但在我的真实场景中,应用程序向客户端发送**聊天列表**,其中包含有关每个人的信息以及他们的**最后**消息。 – Mergasov

+0

@Mergasov不知道这将如何改变任何东西 –

+0

我试图做这样的事情:'context.Messages .Where(msg => msg.Chat.Users.Any(u => u.Id == currentuser.Id ).Include(msg => msg.Chat)' 但是,我怎样才能得到每个聊天**的最后一条消息**?它返回任何与当前用户相关的聊天信息msg 我需要GroupBy ()方法,但它在EF Core的客户端工作 – Mergasov

相关问题