实体列表包含实体

本文关键字:实体 包含 列表 | 更新日期: 2023-09-27 18:37:14

我有一个EF模型,其中两个实体具有M到M关系,如下所示:

public class User
{
    public int UserId { get; set; }
    [System.ComponentModel.DataAnnotations.Schema.InverseProperty("Received")]
    public virtual System.Collections.Generic.ICollection<Message> ReceivedMessages { get; set; }
}
public class Message
{
    public int MessageId { get; set; }
    public virtual System.Collections.Generic.ICollection<User> Received { get; set; }
    public Message()
    {
        this.Received = new System.Collections.Generic.List<User>();
    }
}

有时我有 2 个用户的 ID,想检查是否有仅与这 2 个用户相关的消息:

B.Models.User U1 = db.Users.Single(u => u.UserId == ID1);
B.Models.User U2 = db.Users.Single(u => u.UserId == ID2);
B.Models.Message header = db.Messages.Single(m => m.Received.Count() == 2 && m.Received.Contains(U1) && m.Received.Contains(U2));

但是,我收到一个错误,即在这种情况下只能使用原始值。我没有包含 UserId 和 MessageId 的实体,那么如何实现此目的?

实体列表包含实体

以下是查找正好包含 ID1 和 ID2 用户的任何消息的方法:

db.Messages.Where(msg => msg.Received.Count() == 2 && msg.Received.Any(user => user.UserId == ID1) && msg.Received.Any(user => user.UserId == ID2));

如果您像问题中一样使用 Single 方法,如果它找到多个符合该条件的消息,它将引发异常。 Where将返回一个 IEnumerable,您可以将其投射到列表中或在 foreach 中使用。

Contains在您的示例中不起作用的原因是,包含是 ICollection 接口的一种方法,Linq 到实体不支持该方法。 Any方法在功能上相似,但最好检查 ID 的相等性,而不是引用的相等性。