2

次のようなモデルを想定します。

class public Post
{
    public int Id {get; set;}
    public virtual ICollection<Comment> Comments {get;set;}
}

投稿/インデックスページに、各投稿のコメント数(すべての投稿のコメントの総数ではない)とともに投稿のリストを表示したいと思います。

1:使用する場合

context.Posts.Include("Comments")

関連するすべてのコメントのエンティティ全体が読み込まれます。実際、必要なのはコメントの数だけです。

2:各投稿の数を1つずつ取得する場合:

var commentCount = context.Entry(post)
                      .Collection(p => p.Comments)
                      .Query()
                      .Count();

それはN+1の問題です。

誰かが正しい方法を知っていますか?

ありがとうございました!

4

2 に答える 2

2

プレゼンテーション層/ビューモデルにこれが必要ですか?このような場合は、専用のViewModelを作成してください

public class PostListView 
{
    public Post Post { get; set; }
    public int CommentsCount { get; set; }
}

そして、射影でクエリを使用します。

var data = context.Posts
                  .Select(p => new PostListView
                      {
                          Post = p,
                          CommentsCount = p.Comments.Count()
                      });

そして、これで完了です。必要に応じて、エンティティの代わりにのプロパティPostListViewが含まれるようにフラット化できます。PostPost

于 2011-07-09T11:24:51.103 に答える
0

このようなものはどうですか?

public class PostView
{
    public String PostName { get; set; }
    public Int32 PostCount { get; set; }
}

public static IEnumerable<PostView> GetPosts()
    {
        var context = new PostsEntities();

        IQueryable<PostView> query = from posts in context.Posts
                                     select new PostView
                                                {
                                                    PostName = posts.Title,
                                                    PostCount = posts.PostComments.Count()
                                                };

        return query;
    }

次に、次のようなものを使用します。

foreach (PostView post in GetPosts())
        {
            Console.WriteLine(String.Format("Post Name: {0}, Post Count: {1}", post.PostName, post.PostCount));
        }

リストを次のように表示する必要があります。

  • 投稿名(12)
  • 投稿名(1)

于 2011-07-09T12:16:38.310 に答える