簡體   English   中英

包含在 EF Core 3.0 上無法按預期工作

[英]Include does not work as expected on EF Core 3.0

我將 ASP.NET Core 2.2 MVC web 應用程序遷移到 .NET Core 3.0。 在某些情況下,包含不能正常工作。

var forms = _context.CheckInOutForm
    .Include(x => x.Employee)
    .AsQueryable();

// apply filter and sorting
forms = FilterForms(forms);
forms = SortForms(forms, sort);

// convert to viewmodel (database model as parameter in the constructer)
var items = forms.Select(x => new CheckInOutViewModel(x));

// load data for current page (with X.PagedList nuget package)
var pagedList = items.ToPagedList(pageNumber, pageSize);

出於某種原因,EF 為表 CheckInOutForm 構建了一個查詢,其中包含與 Employee 的內部連接,但僅來自表 CheckInOutForm 的 select 字段。 我使用 SQL 分析器捕獲了生成的查詢並對其進行了分析。

此代碼在遷移之前運行良好。 我讀過 EF Core 3.0 改變了連接表的行為。 我仍然不明白為什么它會創建一個只有一張表的字段的 select。

items.ToPagedList 創建了一個帶有 OFFSET 和 FETCH NEXT 的 select。 相同的庫適用於同一應用程序中的其他頁面。

任何提示或想法?

.Include從未與.Select一起使用。 但是您可能在 EF Core 2 中獲得了部分客戶端執行,其中您的.Include運行服務器端,而您的.Select運行客戶端。

使用 EF Core 3,您始終可以執行服務器端查詢,因此您的.Select將抑制.Include

因此(假設FilterFormsSortForms不會對查詢做任何奇怪的事情)您只需要在投影上游運行查詢到 ViewModel。 例如

var items = forms.ToPagedList(pageNumber, pageSize).Select(x => new CheckInOutViewModel(x));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM