如何使用Entity Framework和LINQ连接三张SQL表并查询指定数据
使用EF和LINQ关联三张表查询UserNameValues的Value字段
根据你的实体模型,这里提供两种实现方式,都能满足你的查询需求:
方式一:利用EF导航属性(推荐)
你的实体已经定义了导航属性,EF会自动处理表关联,代码更简洁易读:
假设你的DbContext包含以下DbSet:
public DbSet<User> Users { get; set; } public DbSet<UserName> UserNames { get; set; } public DbSet<UserNameValues> UserNameValues { get; set; }
查询代码:
// 替换为你的目标User ID和UserName.Name int targetUserId = 1; string targetName = "目标名称"; // 异步查询,同步查询可改用ToList() var values = await _context.UserNameValues .Where(uv => uv.UserName.User.Id == targetUserId && uv.UserName.Name == targetName) .Select(uv => uv.Value) .ToListAsync();
这种方式通过UserNameValues.UserName和UserName.User的导航属性链式访问,EF会自动生成对应的SQL JOIN语句。
方式二:显式LINQ JOIN写法
如果你想手动控制JOIN逻辑,可以用连续JOIN的方式:
int targetUserId = 1; string targetName = "目标名称"; var values = await _context.UserNameValues // 第一步:关联UserNameValues和UserName .Join(_context.UserNames, uv => uv.UserNameId, un => un.Id, (uv, un) => new { UserNameValue = uv, UserName = un }) // 第二步:关联上一步的结果和User .Join(_context.Users, combined => combined.UserName.UserId, u => u.Id, (combined, u) => new { combined.UserNameValue, combined.UserName, User = u }) // 过滤条件 .Where(combined => combined.User.Id == targetUserId && combined.UserName.Name == targetName) // 选择需要的Value字段 .Select(combined => combined.UserNameValue.Value) .ToListAsync();
注意事项
- 确保你的DbContext正确配置了实体间的关系(你的模型已包含外键和导航属性,EF通常能自动识别)
- 如果查询结果可能有重复值,可以添加
.Distinct()去重 - 同步场景下将
ToListAsync()替换为ToList()即可
内容的提问来源于stack exchange,提问作者NGDeveloper
相关产品推荐
相关产品推荐

