在連接表上使用EF Core ThenInclude()

asp.net-core asp.net-core-mvc entity-framework entity-framework-core

我正在將我的.NET Framework(EF6)代碼轉移到ASP.NET Core(EF Core),我偶然發現了這個問題。這是一些示例代碼:

在EF6中,我使用Include()和Select()進行預加載:

return _context.Post
.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))

PostAuthor是一個聯結表,還有一個Junction表“AuthorInterest”,我不需要參與EF6(Select直接進入a.Interests)。

無論如何,我可以看到在EF7中這是重做的,這意味著我現在應該使用ThenInclude()來嵌套查詢。然而...

return _context.Post
  .Include(p => p.PostAuthor)
    .ThenInclude(pa => pa.Select(pa2 => pa2.Author))
...etc

由於Select()語句,上面的代碼失敗了。關於https://docs.efproject.net/en/latest/querying/related-data.html的文檔似乎暗示我不需要它,我可以立即訪問作者,但我在最後一個lambda中獲得了ICollection顯示,所以我顯然需要Select()。我在查詢中進一步查看了多個聯結表,但為了簡單起見,我們只關注第一個。

我該如何工作?

一般承認的答案

但是我在顯示的最後一個lambda中得到一個ICollection,所以我顯然需要Select()

不,你沒有。 EF Core Include / ThenInclude完全取代了ThenInclude使用的Select / SelectMany的需要。它們對集合和引用類型導航屬性都有單獨的重載。如果對集合使用重載,則ThenInclude對集合元素的類型進行操作,因此最後總是以單個實體類型結束。

在您的情況下, pa應該解析為您的聯結表元素類型,因此應該可以直接訪問Author

例如,EF6包括鏈:

.Include(p => p.PostAuthor.Select(pa => pa.Author).Select(a => a.Interests))

轉換為EF Core:

.Include(p => p.PostAuthor).ThenInclude(pa => pa.Author).ThenInclude(a => a.Interests)


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow