亚音速3简单存储库的多对多关系

时间:2009-12-15 12:45:22

标签: linq subsonic3 many-to-many

我在之前的帖子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查询的最佳方法是什么。让我们说我希望得到附加用户的所有角色。有人可以帮我这个吗?

2 个答案:

答案 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逐步执行代码时,即使我可以加载用户,也不会将用户添加到角色中。

我在这里缺少什么?

相关问题