查询多对多关系用户 -> 类
Query on many-to-many relationship Users -> Classes
我有两个实体,Users 和 类,具有多对多关系。我正在使用 .Net Core,我在这个博客 post HERE 之后建立了关系(直到第 3 部分)。数据库有效,我可以添加 classes 并填充连接 table,但我不知道如何检索用户注册的所有 classes,或者反过来,所有在特定 class.
中注册的用户
我需要它来解决用户已经登录 class 并且我不必向连接 table 添加新条目的情况(这仍然会抛出一个错误)。
User.cs
public class User : IdentityUser
{
// Making the classes a JoinCollectionFacade allows us to perform actions like adding a class
public User()
=> Classes = new JoinCollectionFacade<Class, UserClass>(
UserClass,
uc => uc.Class,
c => new UserClass { User = this, Class = c });
public string FirstName { get; set; }
public string LastName { get; set; }
public string Type { get; set; }
//public string Email { get; set; }
public string Phone { get; set; }
public string Membership { get; set; }
private ICollection<UserClass> UserClass { get; } = new List<UserClass>();
// This element does not need to be mapped. It's used for easier reference
// to the Users enrolled in the class
[NotMapped]
public ICollection<Class> Classes { get; }
}
Class.cs
public class Class
{
// Making the classes a JoinCollectionFacade allows us to perform actions like adding a class
public Class()
=> Users = new JoinCollectionFacade<User, UserClass>(
UserClass,
uc => uc.User,
u => new Models.UserClass { User = u, Class = this });
public Class(Instructor i, string d)
{
Instructor = i;
Description = d;
}
public int Id { get; set; }
public virtual Instructor Instructor { get; set; } // Made virtual so we can take advantage of certain Entity Framework such as lazy loading (from Microsoft docs)
public string Description { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
private ICollection<UserClass> UserClass { get; } = new List<UserClass>();
// This element does not need to be mapped. It's used for easier reference
// to the Users enrolled in the class
[NotMapped]
public ICollection<User> Users { get; }
}
用户Class.cs
public class UserClass
{
public string UserId { get; set; }
public User User { get; set; }
public int ClassId { get; set; }
public Class Class { get; set; }
}
我通过
解决了我的问题
- 在 User.cs 和 Class.cs
中创建 UserClass public 的实例
- 使用下面的这种查询来检索在特定 class
中注册的所有用户
var usersInClass = _context.Users
.Include(i => i.UserClass).ThenInclude(i => i.Class)
.Where(x => x.UserClass.Select(pc => pc.Class).Any(c => c.Id == id))
.ToList();
我有两个实体,Users 和 类,具有多对多关系。我正在使用 .Net Core,我在这个博客 post HERE 之后建立了关系(直到第 3 部分)。数据库有效,我可以添加 classes 并填充连接 table,但我不知道如何检索用户注册的所有 classes,或者反过来,所有在特定 class.
中注册的用户我需要它来解决用户已经登录 class 并且我不必向连接 table 添加新条目的情况(这仍然会抛出一个错误)。
User.cs
public class User : IdentityUser
{
// Making the classes a JoinCollectionFacade allows us to perform actions like adding a class
public User()
=> Classes = new JoinCollectionFacade<Class, UserClass>(
UserClass,
uc => uc.Class,
c => new UserClass { User = this, Class = c });
public string FirstName { get; set; }
public string LastName { get; set; }
public string Type { get; set; }
//public string Email { get; set; }
public string Phone { get; set; }
public string Membership { get; set; }
private ICollection<UserClass> UserClass { get; } = new List<UserClass>();
// This element does not need to be mapped. It's used for easier reference
// to the Users enrolled in the class
[NotMapped]
public ICollection<Class> Classes { get; }
}
Class.cs
public class Class
{
// Making the classes a JoinCollectionFacade allows us to perform actions like adding a class
public Class()
=> Users = new JoinCollectionFacade<User, UserClass>(
UserClass,
uc => uc.User,
u => new Models.UserClass { User = u, Class = this });
public Class(Instructor i, string d)
{
Instructor = i;
Description = d;
}
public int Id { get; set; }
public virtual Instructor Instructor { get; set; } // Made virtual so we can take advantage of certain Entity Framework such as lazy loading (from Microsoft docs)
public string Description { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
private ICollection<UserClass> UserClass { get; } = new List<UserClass>();
// This element does not need to be mapped. It's used for easier reference
// to the Users enrolled in the class
[NotMapped]
public ICollection<User> Users { get; }
}
用户Class.cs
public class UserClass
{
public string UserId { get; set; }
public User User { get; set; }
public int ClassId { get; set; }
public Class Class { get; set; }
}
我通过
解决了我的问题- 在 User.cs 和 Class.cs 中创建 UserClass public 的实例
- 使用下面的这种查询来检索在特定 class 中注册的所有用户
var usersInClass = _context.Users
.Include(i => i.UserClass).ThenInclude(i => i.Class)
.Where(x => x.UserClass.Select(pc => pc.Class).Any(c => c.Id == id))
.ToList();