2009-12-15 59 views
0

我在前面的帖子here on stackoverflow看到了多對多關係的例子。爲了簡單起見,讓我們看看這些類:subsonic 3簡單的存儲庫多對多關係

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

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(); 
} 

但是用戶不會被添加到該角色,即使我本來可以當我使用調試通過代碼得到了用戶加載。

我在這裏錯過了什麼?

+0

發現我必須加載角色爲.ToList()作爲base.All ()返回IQueryable; o) 所以我改變base.All ()基地。所有().ToList()和一切工作就像一個魅力; o) – 2009-12-20 21:18:53

+0

我不知道你的意思是我的方法需要數據庫查找(這兩種情況下,你是從IQueryable對象創建一個列表),但如果你已經完成的作品,對你有意義,然後去做。我仍然認爲我的方法會更容易壽;) – woopstash 2009-12-21 18:04:44

+0

在上面你做的實體做這個「_User = this.Users.SingleOrDefault();」你不從數據庫中加載一個用戶嗎? – 2009-12-22 08:16:52

0

我從來沒有真正寫過這種事情的linq查詢,因爲我寧願使用內置的活動目錄存儲庫。如果你想要走這條路線:

我先開始通過確保您的數據庫具有配置了相應的外鍵:

Table 'Roles' 
int Id (PK) 

Table 'Users' 
int Id (PK) 

Table 'UsersAndRoles' 
int RoleId (FK) 
int UserId (FK) 

如果做得正確,Subsonic3將生成類爲您創造IQueryable子對象。如果您想要附加所有用戶角色,則還需要將角色對象的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; 
    } 
} 

當然,這是寫意所以難免有被編譯錯誤。讓我知道這是否有幫助。祝你好運!

+0

只是注意到你問的是簡單的存儲庫......我認爲大部分這將幫助你,但我從來沒有使用SR,所以盡你所能。 – woopstash 2009-12-18 01:51:33