0

2 つのエンティティが次のような M 対 M の関係を持つ EF モデルがあります。

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 を含むエンティティがないので、どうすればこれを達成できますか?

4

1 に答える 1

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リストにキャストしたり foreach で使用したりできる IEnumerable を返します。

Containsあなたの例でうまくいかなかった理由は、Contains が ICollection インターフェイスのメソッドであり、Linq-to-Entities でサポートされていないためです。このAny方法は機能的には似ていますが、参照が等しいかどうかを確認するよりも、ID が等しいかどうかを確認する方が適切です。

于 2013-10-28T19:34:52.757 に答える