2017-12-11 13 views
0

私は2つのテーブル:BlogPostを持っています。ブログテーブルには多くの投稿があります。子要素をn個取得する

私は対応するポストを持つブログを取得したいと思いますが、ブログごとに4つの投稿があり、4つの投稿しか得られない場合にのみ取得したいと思います。また、その後、私はAutomapperを使用して、私のモデルに結果をマップしたいと思います:

return _context.Blogs 
       .Include(x => x.Posts) 
       .Where(x => x.IsActive && x.Posts.Count >= 4) 
       .ProjectTo<BlogVm>(); 

BlogVm(同じポストである)Blogエンティティとして同じプロパティが含まれています。私はEntityFrameworkCoreを使用しています。

これはどのように処理できますか?

更新: コードでは、ブログごとにすべての投稿が返されます。 ブログは4件以上、ブログは4件しかありません。

+0

わかりません。何が問題なの?あなたはすでに解決策を持っていませんか?あなたのコードは動作しませんか? – GGO

+0

何が問題なのですか?あなたが対処しているエラーはありますか? – Abbas

+0

私は自分の投稿を更新しました。なにが問題ですか。基本的に、結果にはブログごとのすべての投稿が含まれます。 – Cieja

答えて

-1

私はそれが動作するかどうかわからないんだけど(テストはありません)、しかし、あなたがあなたに取る使用する必要がありますが含まれます:4以上と

var postsFromBlogsWithAtLeastFourPosts = 
    blogs.Where(blog => blog.Posts.Count() >= 4) 
     .Select(blog => blog.Posts.Take(4)) 
     .ProjectTo<BlogVm>(); 

最初のSELECTブログ:

return _context.Blogs 
       .Include(x => x.Posts.Take(4)) 
       .Where(x => x.IsActive && x.Posts.Count >= 4) 
       .ProjectTo<BlogVm>(); 
+1

私はあなたがそのコンテキストで 'Take'を使うことはできないと信じています。' Where() 'と' ProjectTo'の間にあるべきです。 – stuartd

+1

いいえ、動作しません。メッセージ= "プロパティ式 'x => {x.Posts => Take(4)}'は無効です。式はプロパティへのアクセスを表す必要があります: 't => t.MyProperty' – Cieja

+0

フィードバック – OrcusZ

0

はこれを試してみてください投稿。次に、それぞれのブログから4つの投稿を選択します。

または、4つ以上の投稿(ブログごとに1つの投稿)を持つブログから合計4つの投稿が必要でしたか?

var postsFromBlogsWithAtLeastFourPosts = 
    blogs.Where(blog => blog.Posts.Count() >= 4) 
     .Take(4) 
     .Select(blog => blog.Posts.First()) 
     .ProjectTo<BlogVm>(); 
-1

(ご使用のモデルへのマッピングを除く)、これを試してみてください:

var q = (
     from blog in _context.Blogs 
     from post in blog.Posts 
     group blog by new 
         { 
          BlogId = blog.Id, 
          PostId = post.Id, 
          PostText = post.Text, 
         } 
     into g 
     where g.Count() >= 4 
     select new 
       { 
        g.Key.BlogId, 
        g.Key.PostId, 
        g.Key.PostText 
       } 
     ).Take(4); 

または類似:

var q1 = _context.Blogs.SelectMany(blog => blog.Posts, (blog, post) => new { blog, post }) 
         .GroupBy(@t => new { BlogId = blog.Id, PostId = post.Id, PostText = post.Text }, @t => blog) 
         .Where(g => g.Count() >= 4) 
         .Select(g => new { g.Key.BlogId, g.Key.PostId, g.Key.PostText }) 
         .Take(4); 

エラーがあります。結果からわずか4行しかかかりません。 Take(4)がなければ、ブログごとに最低4つの投稿があります。

関連する問題