0

私は.Net Core 2.0の私の最初のプロジェクトで作業しています。それは簡単なブログシステムです。投稿のタイトルとタグに基づいて検索機能を追加したい 私のエンティティ:EFコア2.0で関連するテーブルをフィルタリングする

public class Post 
{ 

    public int ID { get; set; } 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Body { get; set; } 
    public int CategoryID { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public string ImageName { get; set; } 

    public Category Category { get; set; } 
    public ICollection<PostTag> PostTags { get; } = new List<PostTag>(); 
} 

public class PostTag 
{ 

    public int PostID { get; set; } 
    public int TagID { get; set; } 

    public Post Post { get; set; } 
    public Tag Tag { get; set; } 

} 

public class Tag 
{ 
    public int TagID { get; set; } 
    public string Name { get; set; } 
    public int Counter { get; set; } 
    public ICollection<PostTag> PostTags { get; } = new List<PostTag>(); 

    public Tag() 
    { 
     Counter = 1; 
    } 

これまでのところ、私はそのようなことを考え出しました。タグテーブルに参加して、IndexViewの各投稿のすべてのタグを表示できるようにしました。

public async Task<IActionResult> Index(int? page, string searchString) 
    { 

     IQueryable<Post> posts = _context.Posts 
      .OrderByDescending(post => post.ReleaseDate) 
      .Include(post => post.Category) 
      .Include(post => post.PostTags) 
       .ThenInclude(pt => pt.Tag); 

     //SEARCH 
     if (!String.IsNullOrEmpty(searchString)) 
     { 

      posts = posts.Where(post => post.PostTags.Any(pt => pt.Tag.Name.Contains(searchString)) || post.Title.Contains(searchString)); 

      //POPULARITY INCREESE 
      var tag = _context.Tags.SingleOrDefault(t => t.Name == searchString); 
      if (tag != null) 
      { 
       tag.Counter += 1; 
       _context.Update(tag); 
       _context.SaveChanges(); 
      } 
     } 

     int pageSize = 4; 
     return View("Index", await PaginatedList<Post>.CreateAsync(posts.AsNoTracking(), page ?? 1, pageSize)); 

    } 

私は、より簡単で良い方法があるかどうかを知りたいと思います。 関連するテーブルが含まれていないと機能が動作しますか?

+0

関連エンティティposts.where(...)を含めていないと、タイトルが一致する投稿のみが返されるため、機能しませんタグが付いていない。 – Nikolaus

答えて

0

あなたの最後の質問に対する最初の回答:データベースにリクエストを送信していない限り、フィルタリングにInclude()は必要ありません。 エンティティのリストに値を設定し、ナビゲーションプロパティにアクセスする場合などに使用します。リストを反復しながら、Include()を使う必要があります。

Include()を使用しない場合は、必要な値を選択する必要があります。これにより、NavigationPropertiesなどの予期しない動作やこれも同様に回避されます。

+0

PostTagsを含まない場合、比較はどのように正しく動作しますか? – Nikolaus

関連する問題