所以我有一个消息类,并且我正在尝试创建一个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返回发送方和接收方之间的所有消息吗?
这是我的数据库布局的快照,可以实现更好的可视化:
答案 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();