繁体   English   中英

如何通过缩小C#和LINQ中的另一个列表来创建列表

[英]How to create a list by narrowing down another list in c# and linq

我正在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());

希望这足够了。

假设您使用的是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 );

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM