0

我在数据库中有典型的表,如用户、用户组,它们有关系。

在我的域模型中,我希望如果您请求用户,您将获得用户并且每个用户都拥有属于的属性,这意味着这些是他所属的组。在属性中我想要组列表(作为组的类型安全)

另一方面也应该这样做,这意味着每个组都应该知道哪些用户属于该组。

我有这个类(示例):

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

现在,实现它的最佳方法是什么,以及填充所有对象的最快方法是什么。

顺便说一句:我正在使用亚音速来获取所有数据库记录(对于每个表一个选择)。至少有 1500 个用户和 30 个组。

我当前的代码基于组的foreach,组的relationship.where,然后users.singleordefault 来查找用户,然后将用户添加到组,将组添加到用户。但它需要大约 30 秒才能做到这一点。

我的客户端应用程序是一个 web 应用程序,所以我将结果存储在一个缓存的存储库中,这就是我这样做的原因!!

4

2 回答 2

2

我当前的代码基于组的foreach,组的relationship.where,然后users.singleordefault 来查找用户,然后将用户添加到组,将组添加到用户。

我不明白你在这里说什么。

这需要大约 30 秒

鉴于只有 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);
}
于 2009-01-23T11:57:05.770 回答
0

最好的办法是只检索客户端请求的实体,但允许该实体公开一种从数据库中检索其所有相关实体的方法。您不应该尝试一次从数据库中提取所有内容,因为您不确定客户端是否需要这些数据。

做这样的事情:

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

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

如果您愿意,您可以创建一个将该值作为User类成员保存的属性,并使用该GetUserGroups方法为您延迟加载该值。

于 2009-01-23T11:32:30.483 回答