2013-03-29 2 views
1

Я работаю над проектом, который имеет следующую модель:LINQ - Отображение списка книг друзей пользователя

enter image description here

Я нахожусь успешно в состоянии создать пользователь с друзьями, создать пользователь с книгами, и создавать друзей с книгами.

То, что я пытаюсь сделать сейчас, отображает список книг друзей пользователя.

В моей базе данных, у меня есть два пользователей:

1 Jill

2 Джек

Джилл и Джек оба друзей.

Если вошли как Джилл, я могу успешно отображать книги Джека с этим запросом:

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; 

Я предположил, что, если войти в систему как Джек, тот же запрос предоставит книги Джилл. Но вместо этого он предоставляет Книжный список Джека.

Я хочу войти в систему как Джек и отобразить Список книг Джилла. Что мне здесь не хватает? Это связано с тем, что пользователи находятся в базе данных?

ответ

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 описал бы это более точно. Свойства nav в User могут быть лучше описаны как FriendOf и FriendsWith для определения владельца дружбы (то есть Id vs User1.Id в таблице дружбы). Это должно сделать все более ясным:

var friends = u.FriendsWith.Union(u.FriendOf); 
+0

Да, это работает отлично. Благодаря! – JAck28

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.User.Id в случае c.User1.Id является u.Id и c.User.Id иначе.

Смежные вопросы