[英]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核心的具体方法,如Include
, ThenInclude
, AsNoTracking
前等AsExpandable
。 或者根本不使用AsExpandable
在需要它的表达式上手动调用Expand()
,例如代替
query = query.AsExpandable().Where(filter);
用
query = query.Where(filter.Expand());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.