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

ASP.NET Core中用Entity Framework实现两表INNER JOIN的方法

ASP.NET Core EF Core 实现User与Type_access_user的INNER JOIN查询

步骤1:优化实体类(推荐方式)

给User类添加导航属性,让EF Core自动识别表间关联关系:

public class Type_access_user
{
    [Key]
    public int id { get; set; }
    public string? name { get; set; }
    public DateTime createdAt { get; set; }
    public DateTime updatedAt { get; set; }
}

public class User
{
    [Key]
    public int id { get; set; }
    public string? uid { get; set; }
    public int? type_access_user_id { get; set; }
    // 新增导航属性,关联Type_access_user表
    [ForeignKey("type_access_user_id")]
    public Type_access_user? TypeAccessUser { get; set; }
    // 补充原查询中用到的时间字段(原实体类遗漏)
    public DateTime createdAt { get; set; }
    public DateTime updatedAt { get; set; }
}

步骤2:创建DTO类(推荐)

原User实体不包含权限名称字段,创建DTO专门返回需要的查询结果:

public class UserWithAccessTypeDto
{
    public int id { get; set; }
    public string? uid { get; set; }
    public int? type_access_user_id { get; set; }
    public string? type_access_user_name { get; set; }
    public DateTime createdAt { get; set; }
    public DateTime updatedAt { get; set; }
}

步骤3:两种查询实现方式

方式一:使用导航属性(EF Core推荐)

通过导航属性关联,EF会自动生成INNER JOIN的SQL语句:

return await _context.User
    // 过滤无权限类型的用户,确保INNER JOIN效果
    .Where(user => user.type_access_user_id.HasValue)
    .Select(user => new UserWithAccessTypeDto
    {
        id = user.id,
        uid = user.uid,
        type_access_user_id = user.type_access_user_id,
        // 通过导航属性获取权限名称
        type_access_user_name = user.TypeAccessUser!.name,
        createdAt = user.createdAt,
        updatedAt = user.updatedAt
    })
    .ToListAsync();

方式二:手动编写Join语句(与原生SQL逻辑对应)

若不想修改实体类,可直接手动写Join,和你提供的SQL逻辑完全匹配:

return await _context.User
    .Join(
        _context.Type_access_user,
        user => user.type_access_user_id, // User表外键
        accessType => accessType.id, // Type_access_user表主键
        (user, accessType) => new UserWithAccessTypeDto
        {
            id = user.id,
            uid = user.uid,
            type_access_user_id = user.type_access_user_id,
            type_access_user_name = accessType.name,
            createdAt = user.createdAt,
            updatedAt = user.updatedAt
        })
    .ToListAsync();

关键说明

  • DTO的作用:避免修改实体结构,专门返回业务需要的数据,符合分层架构最佳实践。
  • INNER JOIN效果:两种方式都会只返回存在对应权限类型的用户,和目标SQL结果一致。
  • 导航属性优势:代码更简洁,EF自动维护关联关系,后续扩展关联逻辑更方便。

内容的提问来源于stack exchange,提问作者Daniel Rabelo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:35:59