LINQ - 显示用户的朋友的书单

时间:2013-03-29 16:16:12

标签: c# linq

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

enter image description here

我成功地与朋友一起创建了一个用户,创建了一个有书籍的用户,并创建了有书籍的朋友。

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

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

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的书单。

我想以杰克身份登录并显示吉尔的图书清单。我在这里错过了什么?是否与用户在数据库中的订单有关?

2 个答案:

答案 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中的导航属性可以更好地描述为UserFriendOf来定义友谊的所有权(即友谊表中的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。