You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:37:16