我在数据库中拥有像user,usergroup这样的典型表格,并且它们之间存在关系。
在我的域模型中,我希望如果您请求用户,您将获得用户,并且每个用户都拥有属性,这意味着这些是他所属的组。在属性中我想拥有组列表(类型安全为组)
另一方面应该这样做,这意味着每个组都应该知道哪些用户属于该组。
我有这些课程(例子):
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:我正在使用亚音速来获取所有数据库记录(每个表一个选择)。并且至少有1500个用户和30个组。
我当前的代码基于foreach over groups,relations.where for groups,然后users.singleordefault查找用户,然后将用户添加到组,将组添加到用户。但这需要大约30秒来完成。
我的客户端应用程序是一个webapp,所以我将结果存储在缓存的存储库中,这就是为什么我这样做!
答案 0 :(得分:2)
我当前的代码基于foreach over groups,relations.where for groups,然后users.singleordefault查找用户,然后将用户添加到组,将组添加到用户。
我不明白你在这里说的是什么。
这需要大约30秒来执行此操作
鉴于只有1500名用户和30个小组,你所做的一切似乎太慢了。
现在,最好的方法是实现它,并且最快的方法是填充所有对象。
如果你想......
...然后我建议从数据库中选择加入的记录。
然而,因为......
...然后我建议您尽可能简单地选择所有内容,并加入您的应用程序。
//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);
}
答案 1 :(得分:0)
最好的方法是仅检索客户端请求的实体,但允许该实体公开从数据库中检索其所有相关实体的方法。您不应该尝试从数据库中立即撤回所有内容,因为您不确定客户端是否需要此数据。
做这样的事情:
public class User
{
int Id { get; set; }
string Name { get; set; }
public List<Usergroup> GetUserGroups()
{
// go and get the user groups
}
}
如果您愿意,可以创建一个属性,将该值保存为User
类的成员,并使用GetUserGroups
方法为您延迟加载值。