2

私はフォーラムを作成しており、最近シンプル メンバーシップを実装しました。私が今やろうとしているのは、投稿を書いた人の実際の名前を表示することです。今のところ、ユーザーの UserId しか表示できません。

Simplemembership モデルの AccountModels と、私の ForumModels の 2 つのモデルがあります。私の Forummodel Posts には、UserId のフィールドが含まれています。

AccountModels から ForumModels にいくつかのテーブルを追加しようとしましたが、エラーが発生しました (同じテーブルを 2 回作成しようとしたため)。

Posts と UserProfile を含む ViewModel を作成しようとしましたが、データを正しく入力できませんでした。

最後に、Post と Userprofile の 2 つのテーブルで結合を実行してみました

   var posts = (from p in db.Posts
                     join u in udb.UserProfiles
                     on p.UserId equals u.UserId
                     where p.TopicId == id
                     select p);
        return View(posts);

これによりエラーが発生しました:

指定された LINQ 式には、さまざまなコンテキストに関連付けられているクエリへの参照が含まれています。

私が何をすべきかについてのアイデアはありますか?

4

1 に答える 1

2

2 つの異なるコンテキスト間で Join を実行しようとしているようです。次のいずれかを試すことができます。

1) 最初のコンテキストを呼び出し、次のように ID コレクションをリストに保持します。

var userIds = udb.UserProfiles.UserId.ToList();
var posts = from p in db.Posts 
    where p.TopicId == id && userIds.Contains(p.UserId) 
    select p;

2) シンプル メンバーシップで使用されるものと同じコンテキストに投稿を追加すると、結合を使用できるようになります。

サンプルコードへの更新

//This will retrieve the posts from the database. 
//ToList() will translate and execute the SQL statement, 
//so you can manipulate the colleciton in memory
var posts = (from p in db.Posts 
    where p.TopicId == id
    select p).ToList();

//Get all the user IDs on the post collection. 
var userIds = posts.Select(p => p.UserId).Distinct();

//Then we will select the users in the posts
var users = ubd.UserProfiles.Where(u => userIds.Contains(u.UserId)).ToList();

//Now you have both collections in memory and you can perform the join
var joined = from p in posts
             join u in users
             on p.UserId equals u.UserId
             select new {Title = p.Title, UserName = u.UserName};
于 2013-05-25T12:36:54.460 に答える