1

我正在开发一个具有以下模型的项目:

在此处输入图像描述

我能够成功地创建一个有朋友的用户,创建一个有书籍的用户,以及创建一个有书籍的朋友。

我现在要做的是显示用户朋友的书单。

在我的数据库中,我有两个用户:

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 身份登录,相同的查询将提供 Jill's Books。但它提供了杰克的书单。

我想以 Jack 的身份登录并显示 Jill 的书单。我在这里想念什么?它与用户在数据库中的顺序有关吗?

4

2 回答 2

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可以更好地描述为FriendOfFriendsWith定义友谊的所有权(即友谊表中的 Id 与 User1.Id)。这应该使事情更清楚:

var friends = u.FriendsWith.Union( u.FriendOf );
于 2013-03-29T16:27:13.950 回答
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。

于 2013-03-29T16:32:35.737 回答