包含无法在EF Core 3.0上正常工作

时间:2019-10-25 15:00:04

标签: c# entity-framework .net-core-3.0 asp.net-core-3.0

我将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创建一个选择。相同的库可在同一应用程序的其他页面上工作。

有任何提示或想法吗?

1 个答案:

答案 0 :(得分:1)

.Include从未与.Select一起使用。但是您可能已经在EF Core 2中获得了部分客户端执行,其中.Include在服务器端运行,而.Select在客户端运行。

使用EF Core 3,您始终可以执行服务器端查询,因此.Select将禁止.Include

因此(假设FilterFormsSortForms对查询没有任何奇怪的作用),您只需要在投影到ViewModel的上游运行查询。 EG

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