あなたは以下のように使用することができます。
var usersWithFriends = context.Users
.GroupJoin(context.FriendShips, u => u.UserID, f => f.UserID, (u, f) => new
{
User = u,
Friends = f.Join(context.Users, f1 => f1.TheirFriends, u1 => u1.UserID,
(f1, u1) => u1)
})
.ToList();
結果は匿名オブジェクトのコレクションであり、各要素が持つUser
性質を持っていますユーザーと、すべてのユーザーを含むコレクション指定されたユーザーの友人です。 GroupJoin
のため、結果には友人のいないユーザーも含まれます(この場合はFriends
コレクションは空です)。おおよそのように:
Element[0]:
User -> "Jim"
Friends -> "John" + "Diana"
Element[1]:
User -> "John"
Friends -> empty
Element[2]:
User -> "Diana"
Friends -> "John"
しかし、これはそのようなモデルで動作するEntity-Frameworkの方法ではありません。なし(
modelBuilder.Entity<User>()
.HasMany(u => u.Friends)
.WithMany()
.Map(x =>
{
x.MapLeftKey("UserID");
x.MapRightKey("TheirFriends");
x.ToTable("FriendShips");
});
FriendShips
データベースにだけ結合表のようになります。
public class User
{
[Key]
public string UserID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
//...
public ICollection<User> Friends { get; set; }
}
とユーザとの間の多対多の関係は:あなたが実際にあなたのUser
クラスのナビゲーションプロパティを持つ必要がありますFriendShipID
列、UserID
およびTheirFriends
)を使用します。モデルではエンティティではなく、複合キーを作成します。 User
はあなたの唯一のエンティティです。それで、同じ結果をより簡単に達成することができます。
var usersWithFriends = context.Users.Include(u => u.Friends).ToList();
コードの行数が少なくなるだけでなく、読みやすく理解しやすくなります。 EFは、クエリがSQLに変換されたときにデータベース内の複雑な結合およびグループ化について気にします。
編集
あなたはFriends
コレクションに既存のユーザーを追加することによって(リンクテーブルFriendShips
中=の行)の関係を追加することができます。
using (var context = new MyContext())
{
var user = context.Users.Single(u => u.UserID == "John");
var friend = context.Users.Single(u => u.UserID == "Diana");
user.Friends = new HashSet<User>();
user.Friends.Add(friend);
context.SaveChanges(); // will write a new row into the join table
}
を同様にあなたが関係を削除することができます(行を削除結合テーブルから):
using (var context = new MyContext())
{
var user = context.Users.Include(u => u.Friends)
.Single(u => u.UserID == "John");
var friend = user.Friends.Single(u => u.UserID == "Diana");
user.Friends.Remove(friend);
context.SaveChanges(); // will delete a row from the join table
}
「;ジョン、ダイアナジム」とそれらの名前 `している、これはのように、セパレータをコレクションのようなものを表しTheirFriends`文字列は`ことを意味してい
using (var context = new MyContext())
{
var user = new User { UserID = "John" };
var friend = new User { UserID = "Diana" };
context.Users.Attach(user);
context.Users.Attach(friend);
user.Friends = new HashSet<User>();
user.Friends.Add(friend);
context.SaveChanges(); // will write a new row into the join table
}
using (var context = new MyContext())
{
var user = new User { UserID = "John" };
var friend = new User { UserID = "Diana" };
user.Friends = new HashSet<User>();
user.Friends.Add(friend);
context.Users.Attach(user);
// attaching friend is not necessary, it is already attached with user
user.Friends.Remove(friend);
context.SaveChanges(); // will delete row from the join table
}
:データベースからの電子・ユーザーは、プライマリ・キーの値を持っているので、 UserIDs'?そして 'FriendShip'クラスの' UserID'プロパティは何ですか? – Slauma
@ slaumaユーザーが友人を追加すると、FriendsFriend列に自分の友人のuserIDとfriendship表のUserIDに自分のuserIDが挿入されます。だから友だちテーブルのUserIDを持つ特定のユーザーを検索すると、私は自分のすべての友達を返すでしょう。通常、私はSQLでこれを行うときに私はそれらを結合するビューを使用します。 – JED
EF/MVCチュートリアル(http://www.asp.net/mvc/overview/models-(data))をご覧ください。 – RickAndMSFT