0

関連データを自分のビューに渡す際に問題が発生しているようです。3 つのテーブルのデータベース アーキテクチャを持つ単純なブログを作成しています。これらは、ユーザー、投稿、およびコメントです。私のユーザー プロファイル ページでは、これらのテーブルのすべてのデータをユーザー プロファイル ビューに渡したいと考えています。Linq to SQl を使用してデータベース モデルを作成しました。Linq を使用してデータを渡す試みは次のとおりです。

public ActionResult NewProfile()
    {
        var users = from u in db.UserModels
                    join p in db.PostModels on u.UserId equals p.UserId
                    where u.UserId == WebSecurity.CurrentUserId
                    select new Profile { UserModel = u, PostModel = p };

        return View(users);
    }

これは受信ビューのコードです:

@model IEnumerable<MvcBlog.Models.Profile>

@{
    ViewBag.Title = "NewProfile";
 }

 <h2>NewProfile</h2>

 @foreach (var item in Model)
 {
    @item.UserModel.Username
 }

結果を説明する前に、データベース内のデータについて説明することが重要だと思います。現在、ユーザーは 3 人しかいません。これらのユーザーのうち 1 人 (gb201) だけがブログ投稿を作成しました。ユーザー gb201 は合計 2 つのブログ投稿を作成しました。

プログラムを実行し、ユーザー gb201 としてログインすると、NewProfile ページに次のデータが表示されます。

New Profile

gb201
gb201

ビューには 2 つのテーブルからデータが渡されますが、ユーザー テーブルにクエリを実行したい場合、そのユーザーの投稿数に基づいてデータが複製されます。したがって、ユーザーの投稿が 1 つしかない場合、その投稿は 1 回しか表示されません。何も投稿していない他の 2 人のユーザーについては、このページに表示される情報はありません。

データベースにクエリを実行しているlinqコードが間違っていると思いますが、何が間違っているのかわかりません。長い質問で申し訳ありませんが、助けていただければ幸いです。

4

2 に答える 2

1

投稿ごとに新しいプロファイルを作成しているため、表示される内容は正しいです。

単に 1 人のユーザーを返したい場合は、Post に参加して後で投稿データを含める必要はありません。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                         .Include(u => u.Posts)
                         .ToList()

次に、ネストされたループで各ユーザーを読み取り、次に各投稿を読み取ることができます。

更新: PC で

あなたの見解では

@model IEnumerable<MvcBlog.Data.UserModel>

@{
    ViewBag.Title = "NewProfile";
 }

 <h2>NewProfile</h2>

 @foreach (var item in Model)
 {
    @item.Username

    //if you wanted the postes per user
    foreach(var post in user.Posts)
    {
        @post.Title
    }        
 }

私のようにデータクラスを使用する代わりに、ビューのモデルを作成することをお勧めします。

更新: Linq to SQL を使用するには

上記は、ビューで使用できるビューモデルを構築します。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId )
                       //.Include(u => u.Posts)
                         .Select(u => UserViewModel{ UserModel = u, Posts => u.Posts})
                         .ToList()
于 2013-04-29T07:20:00.220 に答える
1

NinjaNye の答えは正しいですが、次のように、viewmodel 呼び出しの前に「new」が必要です。

var users = db.UserModels.Where(u => u.UserId == WebSecurity.CurrentUserId)
                     .Select(u => new UserViewModel{ UserModel = u, Posts => u.Posts })
                     .ToList();
于 2015-10-27T12:18:50.580 に答える