我在之前的帖子here on stackoverflow中看到了一个关于多对多关系的例子。为了简单起见,我们来看看这些类:
public class Role(){
public int Id { get; set; }
public string Rolename { get; set; }
public string Description { get; set; }
}
public class User(){
public int Id { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public IList<UsersAndRoles> UsersAndRoles { get; set; }
}
public class UsersAndRoles(){
public int Id { get; set; }
public User User { get; set; }
public Role Role { get; set; }
}
这是徒手的,所以请耐心等待。
现在,对这些类进行linq查询的最佳方法是什么。让我们说我希望得到附加用户的所有角色。有人可以帮我这个吗?
答案 0 :(得分:0)
我从来没有真正为这种事情编写linq查询,因为我宁愿使用内置的活动目录存储库。如果你想走这条路:
我首先要确保您的数据库配置了适当的外键:
Table 'Roles'
int Id (PK)
Table 'Users'
int Id (PK)
Table 'UsersAndRoles'
int RoleId (FK)
int UserId (FK)
如果这样做正确,Subsonic3将为您创建创建IQueryable子对象的类。如果要在附加用户的情况下获取所有角色,则还需要向Role对象添加UsersAndRoles列表。 您必须以不同的名称命名,因为您无法将其命名为与IQueryable对象相同:
public partial class Role()
{
public int Id { get; set; }
public string Rolename { get; set; }
public string Description { get; set; }
private IList<UsersAndRoles> _UserToRoleLinks
public IList<UsersAndRoles> UserToRoleLinks
{
get
{
if(_UserToRoleLinks == null)
_UserToRoleLinks = this.UsersAndRoles.ToList();
return _UserToRoleLinks;
}
}
}
public partial class UsersAndRoles
{
private Role _Role;
public Role Role
{
get
{
if (_Role == null)
_Role = this.Roles.SingleOrDefault();
return _Role;
}
set
{
_Role = value;
}
}
private User _User;
public User User
{
get
{
if (_User == null)
_User = this.Users.SingleOrDefault();
return _User;
}
set
{
_User = value;
}
}
}
现在要获取附加用户的所有角色,请执行以下操作:
var roles = Role.All();
访问所有角色的所有用户:
foreach (var role in roles)
{
foreach (var userToRoleLink in role.UserToRoleLinks)
{
var currentUser = userToRoleLink.User;
}
}
当然这是徒手的,所以必然存在编译错误。如果这有帮助,请告诉我。祝你好运!
答案 1 :(得分:0)
Weel,因为我想保持我的实体清洁而不进行任何数据库查找,我不能像你一样吸烟。
我的实体是这样的:
角色实体
public class Role(){
public int RoleId { get; set; }
public string Rolename { get; set; }
public string Description { get; set; }
public IList<User> Users { get; set; }
public Role()
{
RoleId = 0;
Rolename = "";
Description = "";
Users = new List<User>();
}
}
用户实体
public class User(){
public int UserId { get; set; }
public string Username { get; set; }
public string Password { get; set; }
public string Email { get; set; }
public User()
{
UserId = 0;
Username = "";
Password = "";
Email = "";
}
}
用户和角色实体
public class UsersAndRoles(){
public int Id { get; set; }
public int UserId { get; set; }
public int RoleId { get; set; }
public UsersInRoles()
{
Id = 0;
UserId = 0;
RoleId = 0;
}
}
现在从我的存储库中尝试执行以下操作:
public IList<Role> GetRolesAndUsers()
{
//--- Load all roles
var roles = base.All<Role>();
//--- Run through all roles and add the users to the roles.
foreach (var role in roles)
{
//--- Load the users in the given role
var users = (from u in base.All<User>()
join ur in base.All<UsersInRoles>() on role.RoleId equals ur.RoleId
where u.UserId == ur.UserId
select u).ToList();
//--- Run through the list of users and add the user to the role
foreach (var user in users)
{
role.Users.Add(user);
}
}
//--- Return roles and users
return roles.ToList();
}
但是,当我使用debug逐步执行代码时,即使我可以加载用户,也不会将用户添加到角色中。
我在这里缺少什么?