【发布时间】:2018-03-01 15:09:09
【问题描述】:
我正在使用 asp.net mvc 核心和实体框架构建一个 web api。
我有两个对象,它们之间存在多对多关系。
class User
{
public string ID { get; set; }
public List<Message> Inbox { get; set; }
}
class Message
{
public int ID { get; set; }
public List<User> Recipients { get; set; }
}
为了创建一条新消息,客户端向我的控制器发送一个 JSON,其结构如下:
// POST /api/message
{
body: "...", // the body and other properties of the message
recipients: ["user1", "user2"] // a list of the IDs of the recipients of this message
}
所以基本上我需要创建一个新的Message 对象并根据我在 JSON 中收到的用户 ID 分配它的 Recipients 属性。
到目前为止,我正在从数据库中提取每个 User 对象以将其分配给我的 Message,但这看起来很浪费资源。
foreach (var userId in json.recipients)
{
var userObject = _dbContext.Users.Find(userId);
message.Recipients.Add(userObject)
}
一定有更好的方法,对吧?如何在不从数据库中提取所有内容的情况下分配收件人?或者至少只做一个请求?
【问题讨论】:
-
首先,尝试
var userRecipients = _dbContext.Users.Where(user => json.recipients.Contains(user.ID)).ToList();。那么你应该可以使用AddRange() -
这种关系不是多对多吗?一条消息可以有多个收件人,一个收件人(用户)可以有多个消息。
-
无论如何,你可以这样做:message.Recipients = json.recipients.Select(u => new User { Id = u}).ToList()。用户必须已经在数据库上。我有一个可行的解决方案,但对于多对多关系,我认为这是适合您情况的模型。如果您希望我发布作为答案,请告诉我
-
@jpgrassi 哦……你说得对!感谢您指出了这一点!我编辑了问题以反映变化。我很想看看你的解决方案!
-
已添加。我为 userId 使用了一个整数,但如果你有字符串,这无关紧要。只有在我找到可行的解决方案后才记得。
标签: c# .net asp.net-mvc entity-framework asp.net-core