繁体   English   中英

使用 EF Core 3.1 加载相关数据

[英]Load related data with EF Core 3.1

我不确定我是否做错了什么,或者这是否是 EF Core 3.1 中的错误,但以下内容适用于 EF 6.x,并且是我正在转换为 EF Core 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 中不起作用

我已经尝试将我的“角色”属性从virtual更改为常规公共属性,但没有更改,奇怪的是,如果我在调用上述代码之前在数据层中调用以下代码:

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

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

有任何想法吗?

谢谢

它更多是LinqKit AsExpandable问题,尽管是由奇怪的 EF Core 要求引起的,即使在其 EF Core 专用版本LinqKit.Microsoft.EntityFrameworkCore 中,LinqKit 也失败/不愿意实现。

问题是 LinqKit 使用自己的查询提供程序,但如果查询提供程序不是他们所期望的(从EntityQueryProvider派生的类),EF Core 会忽略Include和其他一些 EF Core 可查询扩展。

解决方法是把所有的EF核心的具体方法,如IncludeThenIncludeAsNoTrackingAsExpandable 或者根本不使用AsExpandable在需要它的表达式上手动调用Expand() ,例如代替

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM