如何在c#和linq中通过缩小列表来创建列表

本文关键字:列表 缩小 创建 linq | 更新日期: 2023-09-27 18:09:27

我在asp.net mvc中工作,我有一个独特的情况。

我有两张表。

  Message
  MessageUser

用户可以创建一条新消息,然后在该消息中添加更多用户。目前,创建消息的用户没有保存为MessageUser,而只是保存在消息级别。

然而,在其他情况下,相同的用户可能作为MessageUser添加到另一条消息。

我试图显示从两个列表中提取的所有消息:

  1. 用户创建消息的消息列表。
  2. 在Message表下面的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());

希望这就够了

如何在c#和linq中通过缩小列表来创建列表

如果正确设置了外键关系,则可以执行如下操作)

List<Message> MessageList_2 = db.MessageUser.Where(u => u.UserId == userId).Select(m=> m.Message).ToList();
MessageList_1.AddRange(MessageList_2);

MessageList_1应该包含您的答案。您可能还需要考虑按id选择不同的消息。如果你的外键属性不正确,那么这将不起作用,你也会遇到很多其他问题。

如果我没看错的话,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();

假设你正在使用实体框架,你的数据库有正确的外键设置,那么你不需要混乱的复杂的Linq查询,你可以直接使用导航属性在你的实体对象:

假设你的模式是:

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