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
相关产品推荐
相关产品推荐

