包含在 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
。
所以(假设 FilterForms
和 SortForms
没有对查询做任何奇怪的事情)你只需要 运行 投影到 ViewModel 的上游查询。乙
var items = forms.ToPagedList(pageNumber, pageSize).Select(x => new CheckInOutViewModel(x));
我将 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
。
所以(假设 FilterForms
和 SortForms
没有对查询做任何奇怪的事情)你只需要 运行 投影到 ViewModel 的上游查询。乙
var items = forms.ToPagedList(pageNumber, pageSize).Select(x => new CheckInOutViewModel(x));