包含在 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 为 table CheckInOutForm 构建了一个查询,其中包含与 Employee 的内部联接,但只有 table CheckInOutForm 中的 select 个字段。我用 SQL 分析器捕获了生成的查询并对其进行了分析。

此代码在迁移之前运行良好。我读过 EF Core 3.0 改变了加入 tables 的行为。我仍然不明白为什么它会创建一个只有一个 table 字段的 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));