2016-11-10 58 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

相關問題