您可以使用以下方法:
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
性質與一個用戶和一個包含所有用戶的Friends
集合這是給定用戶的朋友。由於GroupJoin
的結果還包含沒有朋友的用戶(Friends
集合在這種情況下爲空)。大致如下:
Element[0]:
User -> "Jim"
Friends -> "John" + "Diana"
Element[1]:
User -> "John"
Friends -> empty
Element[2]:
User -> "Diana"
Friends -> "John"
但是,這不是實體框架的方式來處理這樣的模型。你應該確實有一個導航屬性在User
類:
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; }
}
而且用戶之間的許多一對多的關係:
modelBuilder.Entity<User>()
.HasMany(u => u.Friends)
.WithMany()
.Map(x =>
{
x.MapLeftKey("UserID");
x.MapRightKey("TheirFriends");
x.ToTable("FriendShips");
});
FriendShips
將在數據庫只是一個連接表(不一個FriendShipID
列,UserID
和TheirFriends
改爲創建一個組合鍵),而不是模型中的實體。 User
是您唯一的實體。那麼你可以輕鬆達到相同的結果:
var usersWithFriends = context.Users.Include(u => u.Friends).ToList();
不僅少了幾行代碼,而且更容易閱讀和理解。當查詢翻譯成SQL時,EF將關心數據庫中複雜的連接和分組。
編輯
您可以通過增加現有用戶爲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
}
也可以不詢問th從數據庫E中的用戶,因爲你有主鍵值:
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
}
這是否意味着TheirFriends'表示類似的隔膜集合,如字符串'「吉姆,約翰,戴安娜」,這些名稱是' UserIDs'?那麼FriendShip類中的'UserID'屬性是什麼? – Slauma 2012-03-10 15:01:16
@slauma當一個用戶添加一個朋友時,他會在FriendsFriend列中插入他的朋友的userID,並在友誼表中的UserID中插入他自己的用戶ID。所以無論何時我在友誼表中搜索具有UserID的特定用戶,我都會返回所有他或她的朋友。通常,當我在SQL中這樣做時,我使用視圖來加入它們。 – JED 2012-03-10 15:15:39
您應該閱讀EF/MVC教程(http://www.asp.net/mvc/overview/models-(data)),其中介紹瞭如何實現此目的以及更多。 – RickAndMSFT 2012-03-11 18:36:10