我正在开发一个具有以下模型的项目:
我成功地与朋友一起创建了一个用户,创建了一个有书籍的用户,并创建了有书籍的朋友。
我现在要做的是显示用户的朋友的书单。
在我的数据库中,我有两个用户:
1吉尔
2杰克
吉尔和杰克都是朋友。
如果以Jill身份登录,我可以使用此查询成功显示Jack's Books:
List<int> friendsIds = db
.Friends
.Where(c => c.User.Id == u.Id || c.User1.Id == u.Id)
.Select(c => c.User1.Id)
.ToList<int>();
List<Book> friendsBooks = db
.Books
.Where(c => friendsIds.Contains((int)c.UserId))
.ToList<Book>();
labelMyBooks.Text = sBooks;
string sMyFriendsBooks = "";
foreach (Book b in friendsBooks)
{
sMyFriendsBooks += b.BookTitle + ",";
}
labelMyFriendsBooks.Text = sMyFriendsBooks;
我认为,如果以杰克身份登录,同样的查询将提供吉尔的书籍。但它提供了Jack的书单。
我想以杰克身份登录并显示吉尔的图书清单。我在这里错过了什么?是否与用户在数据库中的订单有关?
答案 0 :(得分:2)
您的初始.Select(...)
方法是原因 - 当匹配开启c.User1.Id
c.User.Id
尝试以下方法:
c.User1.Id
现在,您的实体以令人困惑的方式定义。 var f1 = db.Friends.Where(c => c.User.Id == u.Id).Select(c => c.User1.Id);
var f2 = db.Friends.Where(c => c.User1.Id == u.Id).Select(c => c.User.Id);
List<int> friendIds = f1.Union(f2).ToList();
实际上不是朋友实体,它是两个Friend
实体之间的关系。 User
会更准确地描述它。 Friendship
中的导航属性可以更好地描述为User
和FriendOf
来定义友谊的所有权(即友谊表中的Id vs User1.Id) 。这应该让事情更清楚:
FriendsWith
答案 1 :(得分:0)
选择朋友列表时出现问题。正确的查询应该是这样的:
List<int> friendsIds = db.Friends.Where(c => c.User.Id == u.Id || c.User1.Id == u.Id)
.Select(c => c.User1.Id==u.Id?c.User.Id: c.User1.Id).ToList<int>();
因为如果c.User1.Id是u.Id,那么你应该选择c.User.Id,否则选择c.User.Id。