使用 EF Core 3.1 加载相关数据

Load related data with EF Core 3.1

我不确定我是否做错了什么,或者这是 EF Core 3.1 中的错误,但以下内容适用于 EF 6.x 并且是我正在转换的通用存储库的一部分到 EF 核心 3.1:

  IQueryable<TEntity> query = this.Context.Set<TEntity>();

  if (filter != null)
  {
      query = query.AsExpandable().Where(filter);
  }

  if (includeProperties != null)
  {
      foreach (var includeProperty in includeProperties.Split(new[] { ',' },
                                      StringSplitOptions.RemoveEmptyEntries))
      {
          query = query.Include(includeProperty);
      }
  }

但它在 EF Core 3.1 中不起作用

我已经尝试将我的 "Roles" 属性从 virtual 更改为常规 public 属性 但没有任何变化,奇怪的是,如果我调用以下命令在调用上面的代码之前在我的数据层中添加代码:

var test = this.Context
               .Users
               .Include(u => u.Roles)
               .FirstOrDefault(f => f.Username == "xxx@xxx.com");

它按预期工作,然后如果我执行有问题的代码,它会按预期加载我的角色。

有什么想法吗?

谢谢

更多 LinqKit AsExpandable problem, although is caused by strange EF Core requirement which LinqKit is failing/not willing to implement even in its EF Core dedicated version LinqKit.Microsoft.EntityFrameworkCore

问题是 LinqKit 使用自己的查询提供程序,但如果查询提供程序不是他们所期望的(class 来自 EntityQueryProvider).

解决方法是移动所有 EF Core 特定方法,如 IncludeThenIncludeAsNoTrackingbefore AsExpandable.或者根本不使用 AsExpandable,在需要它的表达式上手动调用 Expand(),例如而不是

    query = query.AsExpandable().Where(filter);        

使用

    query = query.Where(filter.Expand());