2013-10-28 84 views
0

我有一個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的實體,所以我該如何實現?

回答

0

這裏是你如何能找到含有兩種ID1和ID2用戶恰好2個用戶的任何消息:

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在您的示例中不起作用的原因是因爲Contains是ICollection接口的一種方法,Linq-to-Entities不支持。 Any方法在功能上是相似的,儘管檢查ID的相等性要好於參考的相等性。