2017-04-14 18 views
0

私は多対多の関係を持つ2つの表を持っています。詳細なページに関連記事を表示したいのですが、関連する投稿は少なくとも現行の投稿のカテゴリを持つ投稿です。 The Tables 現在の投稿の関連記事を選択するにはどうすればよいですか?Linq多対多選択

[ChildActionOnly] 
    public PartialViewResult GetRelatedPost(int id) 
    { 
     var relatedposts = 
      _db.Posts.Select(x => new { x.Id, x.Title, x.Slug, x.Image, x.IsActive,x.PostType,x.PostCategories }) 
       .Where(x => x.IsActive && x.Id != id && x.PostCategories.Intersect(_db.PostCategories).Any()) 
       .OrderByDescending(x => x.Id).Take(20) 
       .ToList(); 
    } 

はUPDATE:: 私はこのコードで私の問題解決:私はこのコードを試してみましたが、それは私が欲しいものではありません

  var posts = 
      _db.Posts.Select(x => new { x.Id, x.Title, x.Slug, x.Image, x.IsActive,x.PostType,x.PostCategories }) 
       .Where(x => x.IsActive && x.Id != id && x.PostCategories.Intersect(_db.PostCategories.Where(y=>y.Posts.Any(p => p.Id==id))).Any()) 
       .OrderByDescending(x => x.Id).Take(20) 
       .ToList(); 

は、それが最善の方法ですか?

+0

おそらくそれは、ポストと同じくらい簡単です.Categories.SelectMany(投稿);メインの投稿を選択し、熱心に読み込む場合は.Categories.Postsを含めます。 –

+0

@AlexPavenどうすればいいですか?助けてください。 – Mike

+1

私は何かのようなものを考えていました。プロジェクションを維持しています。x => x.Categories.Any(c => c.Posts.Any(p => p.Id == id)))。生成されたSQLは理想的ではないでしょうが、チェックする必要があります。 –

答えて

0

UPDATE:私はこのコードで私の問題を解決:

 var posts = 
     _db.Posts.Select(x => new { x.Id, x.Title, x.Slug, x.Image, x.IsActive,x.PostType,x.PostCategories }) 
      .Where(x => x.IsActive && x.Id != id && x.PostCategories.Intersect(_db.PostCategories.Where(y=>y.Posts.Any(p => p.Id==id))).Any()) 
      .OrderByDescending(x => x.Id).Take(20) 
      .ToList(); 
0

私は、あなたが交差する時にPostCatagoriesの主キーを選択する必要があると思う:

[ChildActionOnly] 
public PartialViewResult GetRelatedPost(int id) 
{ 
    var relatedposts = 
     _db.Posts.Select(x => new { x.Id, x.Title, x.Slug, x.Image, x.IsActive,x.PostType,x.PostCategories }) 
      .Where(x => x.IsActive && x.Id != id && x.PostCategories.Select(y => y.Id).Intersect(_db.PostCategories.Select(y => y.Id)).Any()) 
      .OrderByDescending(x => x.Id).Take(20) 
      .ToList(); 
}).Any()) 
      .OrderByDescending(x => x.Id).Take(20) 
      .ToList(); 
}