【问题标题】:Include does not work as expected on EF Core 3.0包含在 EF Core 3.0 上无法按预期工作
【发布时间】:2019-10-25 15:00:04
【问题描述】:

我将 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 中选择字段。我使用 SQL 分析器捕获了生成的查询并对其进行了分析。

此代码在迁移之前运行良好。我读过 EF Core 3.0 改变了连接表的行为。我仍然不明白为什么它会创建一个只有一个表的字段的选择。

items.ToPagedList 使用 OFFSET 和 FETCH NEXT 创建一个选择。同一个库可以在同一个应用程序的其他页面上工作。

有什么提示或想法吗?

【问题讨论】:

    标签: c# entity-framework .net-core-3.0 asp.net-core-3.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));
    

    【讨论】:

    • 谢谢大卫,这成功了。由于我只有几条 10 万条记录,我没有意识到查询是在客户端执行的。我喜欢 EF3.0 中的变化——它使应用程序更加稳定并提高了性能。在迁移旧应用程序时必须小心。
    猜你喜欢
    • 2019-08-26
    • 2018-05-03
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多