Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过缩小c和linq中的另一个列表来创建列表_C#_Linq - Fatal编程技术网

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

C# 如何通过缩小c和linq中的另一个列表来创建列表,c#,linq,C#,Linq,我在asp.NETMVC工作,我有一个独特的情况 我有两张桌子 Message MessageUser 用户可以创建新邮件,然后向邮件中添加更多用户。当前,创建消息的用户不会保存为MessageUser,而是仅在消息级别保存 但是,在其他情况下,该用户可能会作为MessageUser添加到另一条消息中 我试图显示从两个列表中提取的所有消息: 用户创建消息的消息列表。 用户是消息表下面的MessageUser表中添加的用户的消息列表。 到目前为止,我的努力没有成功 var use

我在asp.NETMVC工作,我有一个独特的情况

我有两张桌子

  Message
  MessageUser
用户可以创建新邮件,然后向邮件中添加更多用户。当前,创建消息的用户不会保存为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());

希望这足够了。

假设您使用的是实体框架,并且您的数据库设置了正确的外键,那么您就不需要处理复杂的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
}

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

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

如果我阅读正确,消息将包含一个列表

如果是这种情况,那么这应该会让你接近:

var List<Message> messages = 
    ( from m 
      in db.Messages 
      where 
          m.UserID == userid || m.MessageUsers.Any(mu => mu.UserID == userID) 
      select m).ToList();

已删除asp.net-mvc标记,因为它不相关。显示表的主字段。也不起作用,不是很有描述性。你需要更加明确。它编译吗?它得到一些数据了吗?你能显示Message和MessageUser之间的关系吗?这似乎是最有效的,但是我的列表类型似乎不同。这就是我如何设置MessageList_1:List MessageList_1=db.Message.Whereu=>u.UserId==UserId.ToList;然后我得到一个错误-无法将类型“void”隐式转换为“System.Collections.Generic.List”有什么想法吗?我的错。我想这是因为.AddRange返回void。编辑答案。编辑通过了吗?我看不出有什么不同?顺便说一句,谢谢你的帮助,这很不一样。不知道是否可以看到编辑更改,但第二行不同。
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);
var List<Message> messages = 
    ( from m 
      in db.Messages 
      where 
          m.UserID == userid || m.MessageUsers.Any(mu => mu.UserID == userID) 
      select m).ToList();