我正在尝试在EF Core 6应用程序中使用ILazyLoader。
public class IDM_Account
{
[Key]
[StringLength(80)]
public string account_id { get; set; } = string.Empty;
[StringLength(255)]
public string name { get; set; } = string.Empty;
}
public class IDM_Relation
{
public ILazyLoader LazyLoader { get; set; }
IDM_Account _account = null!;
[ForeignKey("account_id")]
public IDM_Account Account
{
get
{
if (LazyLoader != null)
LazyLoader.Load(this, ref _account);
if (_account == null)
_account = new();
return _account;
}
set => _account = value;
}
}
public class idm_relationsController : ODataController
{
private readonly DS2DbContext _context;
private readonly ILogger<idm_relationsController> _logger;
public idm_relationsController(DS2DbContext context,
ILogger<idm_relationsController> logger)
{
_logger = logger;
_context = context;
}
[EnableQuery(PageSize = 15)]
public IQueryable<IDM_Relation> Get()
{
return _context.idm_relations.Include(e => e.Account);
}
}
顺便说一句,当通过从IQueryable获取列表来强制加载控制器时,所有数据都被加载:
public IQueryable<IDM_Relation> Get()
{
var q = _context.idm_relations.Include(e => e.Account);
var l = q.ToList();
return q;
}
整个构造用于返回IQueryable<IDM_Relation>从相关OData控制器中的表联接中检索。
当通过返回的IQueryable访问数据记录时,LazyLoader始终为null。这与SO上相关帖子中给出的信息不一致,因为IQueryable应该由EF Core 6处理,所以据我所知,应该在每个数据实例中注入一个LazyLoader。
我正在使用IQueryable<IDM_Relation>因为我需要提供一个带有偏移量和页面大小(记录计数(的数据网格。Imo懒惰加载在这里确实很有意义。
我发现实现我想要的目标的最佳方法是将$expand参数传递给我的OData控制器。