簡體   English   中英

實體列表包含實體

[英]Entity List Contains Entity

我有一個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>();
    }
}

在某些時候,我的ID為2個用戶,並且想要檢查是否只有與以下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的實體,如何實現呢?

您可以通過以下方式找到恰好2個包含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方法,則如果發現多個符合該條件的Message,則會引發異常。 Where將返回IEnumerable,您可以將該IEnumerable轉換為列表或在foreach中使用。

為什么原因Contains在你的例子沒有工作是因為包含是ICollection接口的方法,而不是通過LINQ到實體的支持。 Any方法在功能上相似,盡管檢查ID的相等性要好於引用的相等性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM