LINQ方法中如何仅包含CasinoTableGames表Active=true的行?
解决方案
要在查询中只包含Active为true的CasinoTableGames行,你可以根据EF Core版本选择以下两种方法:
方法1:EF Core 5.0+ 筛选式Include(推荐)
EF Core 5.0及以后支持直接在Include里过滤关联集合,只需给CasinoTableGames加上Where条件,同时保留后续的ThenInclude来加载关联表:
var casino = await _context.Casinos .Include(c => c.CasinoTableGames.Where(ctg => ctg.Active == true)) .ThenInclude(y => y.TableGame) .Include(c => c.CasinoTableGames.Where(ctg => ctg.Active == true)) .ThenInclude(y => y.Manufacturer) .Where(y => y.CasinoID == id) .FirstOrDefaultAsync();
注意:两次
Include都要加相同的筛选条件,EF Core会自动合并这两个操作,最终返回的casino.CasinoTableGames只会包含Active=true的记录,对应的TableGame和Manufacturer也会被正确加载。另外原代码里Where和FirstOrDefaultAsync的条件重复,这里可以去掉FirstOrDefaultAsync里的冗余条件。
方法2:投影方式(兼容低版本EF Core)
如果你的EF Core版本低于5.0,或者更习惯用投影,直接构造需要的对象结构,只筛选活跃的关联记录:
var casinoResult = await _context.Casinos .Where(y => y.CasinoID == id) .Select(c => new { Casino = c, ActiveTableGames = c.CasinoTableGames .Where(ctg => ctg.Active == true) .Include(ctg => ctg.TableGame) .Include(ctg => ctg.Manufacturer) }) .FirstOrDefaultAsync(); // 如果需要将结果映射回Casino实体 var casino = casinoResult?.Casino; if (casino != null) { casino.CasinoTableGames = casinoResult.ActiveTableGames.ToList(); }
这种方式通过投影精准加载需要的数据,不会加载多余的非活跃记录,同时也能保证关联表的数据被正确获取。
内容的提问来源于stack exchange,提问作者Aishwarya
相关产品推荐
相关产品推荐

