我在asp.net mvc工作,我有一个独特的情况。
我有两张桌子。
Message
MessageUser
用户可以创建新邮件,然后向邮件添加更多用户。目前,创建消息的用户不会保存为MessageUser,而只是保存在消息级别。
但是,在其他情况下,可能会将此用户作为MessageUser添加到另一条消息中。
我试图显示从两个列表中提取的所有消息:
到目前为止,我的尝试都没有达成。
var userId = User.Identity.GetUserId();
//Pulls all messages where the user created them.
List<Message> MessageList_1 = db.Message.Where(u => u.UserId == userId).ToList();
//This doesn't work at all, but it's what I'm hoping to do in English.
//I want a list of just the messages where a messageuser is associated to the messageid.
List<Message> MessageList2 = db.MessageUser.Where(u => u.UserId == userId).ToList();
//Another failed attempt
List<Message> MessageList3 = db.Message.Where(u => u.MessageId = MessageUserList.)
//Original that just pulls messages the user created. My hope is to combine the two lists and display them on the same view.
var message = db.Message.Include(o => o.User).Where(u => u.UserId == userId);
return View(await Message.ToListAsync());
希望这已经足够了。
答案 0 :(得分:0)
假设您正在使用Entity Framework并且您的数据库设置了正确的外键,那么您不需要处理复杂的Linq查询,您可以直接在Entity对象上使用Navigation属性:
假设您的架构是:
Users( UserId, ... )
Messages( MessageId, SenderUserId, ... )
MessageUsers( MessageId, UserId )
您的实体类类似于:
class User {
public ICollection<Message> MessagesSent { get; } // bound to Messages.SenderUserId
public ICollection<Message> MessagesReceived { get; } // bound to MessageUsers.MessageId+UserId as a M:M relationship
}
class Message {
public User Sender { get; }
public ICollection<User> Recipients { get; } // bound to MessageUsers.MessageId+UserId as a M:M relationship
}
然后你就可以做到:
IEnumerable<Message> messagesSentByUser = user.MessagesSent;
IEnumerable<Message> messagesReceivedByUser = user.MessagesReceived;
如果您的MessageUser
实体中有更多属性,以至于EF不会将其合并为一个简单的M:M关系(而是给出M:1:M关系),那么您可以这样做:
IEnumerable<Message> messagesSentByUser = user.MessagesSent;
IEnumerable<Message> messagesReceivedByUser = user.MessageUsers.Select( mu => mu.Message );
答案 1 :(得分:0)
如果正确设置了外键关系,那么您可以执行以下操作 )
List<Message> MessageList_2 = db.MessageUser.Where(u => u.UserId == userId).Select(m=> m.Message).ToList();
MessageList_1.AddRange(MessageList_2);
MessageList_1应包含您的答案。 您可能还需要考虑通过id选择不同的消息。 如果您的外键属性不正确,那么这将无法正常工作,您也会遇到很多其他问题。
答案 2 :(得分:0)
如果我正确阅读此内容,Message
将包含List<MessageUser>
。
如果是这样,那么这应该让你关闭:
var List<Message> messages =
( from m
in db.Messages
where
m.UserID == userid || m.MessageUsers.Any(mu => mu.UserID == userID)
select m).ToList();