1

次のモデルを持つプロジェクトに取り組んでいます。

ここに画像の説明を入力

友達とユーザーを作成し、本でユーザーを作成し、本で友達を作成することができました。

私が今やろうとしているのは、ユーザーの友達の本のリストを表示することです。

私のデータベースには、2 人のユーザーがいます。

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's Book List を提供します。

Jack としてログインし、Jill's Book List を表示したい。ここで何が欠けていますか?ユーザーがデータベース内にいる順序と関係がありますか?

4

2 に答える 2

2

あなたの最初の.Select(...)方法が原因です-試合がオンにc.User1.Idなっているときに選択する必要があるときに常に選択しますc.User.Idc.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は実際にはフレンド エンティティではなく、2 つのUserエンティティ間の関係です。 Friendshipより正確に説明します。の nav プロパティは、フレンドシップの所有権(つまり、フレンドシップ テーブルの Id と User1.Id)としてよりUser適切に記述できます。これは物事をより明確にするはずです:FriendOfFriendsWith

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 に答える