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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:45:32