我将ASP.NET Core 2.2 MVC Web应用程序迁移到了.NET Core 3.0。在某些情况下,include无法正常工作。
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中选择字段。我用SQL事件探查器捕获了生成的查询并对其进行了分析。
此代码在迁移之前运行良好。我读过EF Core 3.0改变了联接表的行为。我仍然不明白为什么它只用一个表的字段创建一个选择。
items.ToPagedList使用OFFSET和FETCH NEXT创建一个选择。相同的库可在同一应用程序的其他页面上工作。
有任何提示或想法吗?
答案 0 :(得分:1)
.Include
从未与.Select
一起使用。但是您可能已经在EF Core 2中获得了部分客户端执行,其中.Include
在服务器端运行,而.Select
在客户端运行。
使用EF Core 3,您始终可以执行服务器端查询,因此.Select
将禁止.Include
。
因此(假设FilterForms
和SortForms
对查询没有任何奇怪的作用),您只需要在投影到ViewModel的上游运行查询。 EG
var items = forms.ToPagedList(pageNumber, pageSize).Select(x => new CheckInOutViewModel(x));