返回所有包含LINQ中特定用户的消息

时间:2020-05-26 21:46:41

标签: c# linq entity-framework-core

所以我有一个消息类,并且我正在尝试创建一个GetMethod,该方法返回通过linq方法在2个用户之间交换的所有消息。

我的课:

public class Message
{
    [Key]
    public int MessageId { get; set; }

    public string MessageContent { get; set; }

    public string Sender { get; set; }

    public string Receiver { get; set; }

    public DateTime DateCreated { get; set; }
}

因此,在我的方法中,我尝试获取用户1和用户2之间的所有消息

这是我到目前为止所拥有的

    [Route("GetConversation")]
    [HttpGet]
    public ActionResult GetConverstion([FromQuery] string user1, string user2 )
    {
        var conversation =  _dbContext.Messages.Where(x => x.Receiver == user1 && x.Sender == user2).SingleOrDefault();

        return Ok(new { conversation });


    }

但是,这当然只返回1条消息,仅从user2到user1。

有人可以建议我如何使用LINQ返回发送方和接收方之间的所有消息吗?

这是我的数据库布局的快照,可以实现更好的可视化:

MyDb

2 个答案:

答案 0 :(得分:2)

这应该足够了

var conversations =  _dbContext.Messages.Where(x => 
                          (x.Receiver == user1 || x.Receiver == user2) && 
                          (x.Sender == user2 || x.Sender == user1))

请注意,这将返回从user1发送到user1以及从user2发送到user2的消息,但是只有在您的逻辑不能阻止的情况下,此检查才是必需的。

要考虑的另一点是查询可能返回多个记录的事实,因此对SingleOrDefault()的调用已被删除。

答案 1 :(得分:1)

您已经有了答案,对于接收者为用户2而发送者为用户1的情况,您只需要添加另一组条件。另一个原因是您正在调用.SingleOrDefault(),这必然会返回单行或null。尝试返回列表...

var conversation =  _dbContext.Messages.Where(x => (x.Receiver == user1 && x.Sender == user2) || (x.Receiver == user2 && x.Sender == user1)).ToList();