2009-01-23 54 views
0

我在數據庫中有典型的表,如用戶,用戶組,他們有關係。快速/正確的方式來創建數據庫的域對象

在我的域模型中,我希望如果您請求用戶,您將獲得用戶,並且每個用戶都擁有屬性belongssto,這意味着這些是他所屬的組。在屬性我想有組的列表(類型安全爲組)

另一方面應該做同樣的,這意味着每個組應該知道哪些用戶屬於該組。

我有這個類(例如):

public class User 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    List<Usergroup> BelongsTo { get; set; } 

    User() 
    { 
     BelongsTo = new List<Usergroup>(); 
    } 
} 

public class Usergroup 
{ 
    int Id { get; set; } 
    string Name { get; set; } 
    List<User> Users { get; set; } 

    Usergroup() 
    { 
     Users = new List<User>(); 
    } 
} 

internal class Relation 
{ 
    int userId; 
    int groupId; 
} 

現在,最新最好的方式來實現它,並且什麼讓所有物體充滿了最快的方式。

btw:我使用subsonic獲取所有數據庫記錄(對於每個表選擇)。並且至少有1500個用戶和30個組。

我目前的代碼是基於foreach的羣組,relations.where爲groups,然後users.singleordefault來查找用戶,然後將用戶添加到組和用戶組中。但它需要appx 30secs來做到這一點。

我的客戶端應用程序是一個web應用程序,所以我把所有的結果存儲在一個緩存的存儲庫,這就是爲什麼我這樣做的方式!

回答

2

我目前的代碼是基於foreach的group,relations.where爲groups,然後用users.singleordefault來查找用戶,然後將用戶添加到組和用戶組中。

我不明白你在說什麼。

需要APPX 30secs做到這一點

不管它是你正在做的似乎太慢了,因爲這裏只有1500個用戶和30組。

現在,最好的方式來實現它,以及什麼是最快的方式來獲取所有對象填充。

如果你想......

  • 無論哪種,所有用戶,組爲每個用戶
  • 或者,所有的組,與用戶對各組

...然後我可能會建議從數據庫中選擇聯接的記錄。

然而,因爲......

  • 你想所有數據(在兩個方向上加入)
  • 你只有1500年記錄

...那麼我建議你儘可能簡單地選擇一切,並加入你的應用程序。

//select users 
Dictionary<int, User> users = new Dictionary<int, User>(); 
foreach (User user in selectUsersFromDatabase()) 
{ 
    users.Add(user.Id, user); 
} 
//select groups 
Dictionary<int, Group> groups = new Dictionary<int, Group>(); 
foreach (Group group in selectGroupsFromDatabase()) 
{ 
    groups.Add(group.Id, group); 
} 
//select relations 
//and join groups to users 
//and join users to groups 
foreach (Relation relation in selectRelationsFromDatabase()) 
{ 
    //find user in dictionary 
    User user = users[relation.userId]; 
    //find group in dictionary 
    Group group = groups[relation.groupId]; 
    //add group to user and add user to group 
    user.BelongsTo.Add(group); 
    group.Users.Add(user); 
} 
0

最好的辦法是隻檢索客戶端請求的實體,但允許該實體公開從數據庫中檢索所有相關實體的方法。您不應該嘗試立即從數據庫中取回所有內容,因爲您不確定客戶端是否需要此數據。

做這樣的事情:

public class User 
{ 
    int Id { get; set; } 
    string Name { get; set; } 

    public List<Usergroup> GetUserGroups() 
    { 
     // go and get the user groups 
    } 
} 

如果你想你可以創建一個能夠保持這個值作爲User類的成員屬性,並使用GetUserGroups方法來延遲加載你的價值。

+0

謝謝你的tipp,但那就是我不想做的。我知道我需要所有的數據。 我使用lazyload的一些其他屬性,但在這種情況下,它將是最好的一次獲取所有數據(然後緩存它) – karlis 2009-01-23 11:40:24

相關問題