LinQ连接.NET实体类报错,Guid与外键值对比问题求助
问题描述
两张表存在外键关联,使用LinQ连接查询时出现类型不匹配错误,需实现Guid值与外键的对比逻辑。
第一张表(.NET实体类)
public class User { [Key] [Required] public Guid Id { get; set; } [Required] public string AdRefId { get; set; } }
第二张表(.NET实体类)
public class UserTeamRoleMapping { [Key] [Required] public Guid Id { get; set; } [Required] public Team? TeamId { get; set; } [Required] public User? UserId { get; set; } [Required] public Roles? RoleId { get; set; } }
报错的LinQ查询代码
var res = from u in _dbC.User join utr in _dbC.UserTeamRoleMapping on u.Id equals utr.UserId into g from r in g.DefaultIfEmpty() where (r.TeamId != teamId) select new { Uid = u.Id, UName = ht[u.AdRefId] };
问题根源
UserTeamRoleMapping中的UserId是**User类型的导航属性**,而非Guid类型的外键字段。查询时直接将u.Id(Guid)与utr.UserId(User实例)做相等对比,导致类型不匹配。
解决方案
方案1:修正实体类,添加Guid外键字段
在UserTeamRoleMapping中补充Guid类型的外键字段,与导航属性区分开:
public class UserTeamRoleMapping { [Key] [Required] public Guid Id { get; set; } // Guid类型外键 [Required] public Guid TeamId { get; set; } // 导航属性 public Team? Team { get; set; } // Guid类型外键 [Required] public Guid UserId { get; set; } // 导航属性 public User? User { get; set; } // Guid类型外键 [Required] public Guid RoleId { get; set; } // 导航属性 public Roles? Role { get; set; } }
修改查询逻辑,使用Guid外键关联:
var res = from u in _dbC.User join utr in _dbC.UserTeamRoleMapping on u.Id equals utr.UserId into g from r in g.DefaultIfEmpty() where (r == null || r.TeamId != teamId) // 左连接后需判断r是否为null select new { Uid = u.Id, UName = ht[u.AdRefId] };
方案2:不修改实体类,通过导航属性的Id关联
直接使用导航属性的主键字段进行对比(假设User/Team的主键均为Id):
var res = from u in _dbC.User join utr in _dbC.UserTeamRoleMapping on u.Id equals utr.UserId.Id into g from r in g.DefaultIfEmpty() where (r == null || r.TeamId.Id != teamId) // 左连接后需判断r是否为null select new { Uid = u.Id, UName = ht[u.AdRefId] };
内容的提问来源于stack exchange,提问作者Sooraj
相关产品推荐
相关产品推荐

