0

Ich arbeite an meinem ersten Projekt in .NET Core 2.0. Es ist ein einfaches Blog-System. Ich möchte Suchfunktionen basierend auf Titel und Tags hinzufügen. Meine Entitäten:Verwandte Tabellen in EF Core 2.0 filtern

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; 
    } 

Bisher habe ich mit so etwas kommen. Ich schloss mich der Tag-Tabelle an, um alle Tags für jeden Post in IndexView anzeigen zu können.

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)); 

    } 

Es ist wroking aber ich würde gerne wissen, ob es einen einfacheren oder besseren Weg gibt. Und wird .Where funktionieren, wenn ich nicht verwandte Tabellen einschließe?

+0

Nein, es würde nicht funktionieren, denn wenn Sie nicht die verwandten Entitäten posts.where (...) würde nur die Beiträge, die Titel übereinstimmt, weil es keine sind PostTags und daher keine Tags. – Nikolaus

Antwort

0

Zunächst die Antwort auf Ihre letzte Frage: Solange Sie keine Anfrage an die Datenbank gesendet haben, brauchen Sie Include() nicht zum Filtern. Wenn Sie eine Liste von Entitäten auffüllen möchten und auf Navigationseigenschaften wie z. Während Sie über die Liste iterieren, müssen Sie Include() verwenden.

Wenn Sie die Verwendung von Include() vermeiden möchten, sollten Sie die gewünschten Werte auswählen. Dies wird ein unerwartetes Verhalten bei NavigationProperties oder ähnlichem vermeiden. Ich würde etwas wie folgt tun:

+0

Wenn Sie PostTags nicht verwenden, wie kann ein Vergleich korrekt funktionieren? – Nikolaus

Verwandte Themen