EF Core用Collection.LoadAsync加载User.BookMarks后,如何加载BookMark.VgnItmEst?
解决方案
你可以通过两种方式同时加载BookMark.VgnItmEst导航属性:
方案一:使用Include + ThenInclude 一次性查询(推荐)
直接在查询用户时,通过Include指定要加载的BookMarks集合,再用ThenInclude嵌套加载BookMark关联的VgnItmEst属性,这样能避免多次数据库查询,性能更优:
public async override Task<User> Fetch(string id) { var user = await entities .Include(u => u.BookMarks) .ThenInclude(bm => bm.VgnItmEst) .FirstOrDefaultAsync(u => u.Id == id); return user; }
方案二:显式加载嵌套导航属性
如果必须保留先FindAsync再加载的方式,可以通过Collection.Query()方法获取集合的查询对象,再附加Include来加载嵌套的VgnItmEst,最后执行LoadAsync:
public async override Task<User> Fetch(string id) { var user = await entities.FindAsync(id); if (user != null) { await context.Entry(user) .Collection(u => u.BookMarks) .Query() .Include(bm => bm.VgnItmEst) .LoadAsync(); } return user; }
注意:第二种方式会触发两次数据库查询(一次Find,一次Load),如果没有特殊场景,优先选择方案一。
内容的提问来源于stack exchange,提问作者BeniaminoBaggins
相关产品推荐
相关产品推荐

