2016-12-21 5 views
4

Ich frage mich, wie diese SQL-Abfrage in eine Entity-Framework-Abfrage konvertieren.Entity Framework Core - IN-Klausel entspricht

SELECT * 
FROM Post 
WHERE PostId IN (
SELECT PostId FROM BlogPost 
WHERE BlogId = &blogId); 

Ich versuche eine Liste von Posts mit einer bestimmten Kategorie ID zu bekommen.

Datenbank vereinfacht:

Blog (die Kategorie für den Posten):

BlogId 
Title 
.. 

Beitrag:

PostId 
Title 
.. 

Blogpost für die beiden Tabellen kombinieren und lassen Sie mehrere Kategorien per Post :

PostId 
BlogId 

Dies ist, was ich schon habe, aber natürlich die Abfrage funktioniert nicht:

public async Task<IActionResult> Category(int? id) 
     { 
      int blogId = id; 

      if (blogId == null) 
      { 
       return NotFound(); 
      } 
      ICollection<Post> posts = await _context.Post.Where(pid => pid.PostId.Contains(_context.BlogPost.Where(i => i.PostId == blogId).ToListAsync())).ToListAsync(); 

      if (posts == null) 
      { 
       return NotFound(); 
      } 

      return View(posts); 
     } 

Danke im Voraus.

Antwort

7

Hier ist, wie ich es in einer Abfrage basierend auf den von Ihnen bereitgestellten Informationen tun würde.

var posts = await _context.Post 
    .Where(post => 
     _context.BlogPost.Any(bp => bp.BlogId == blogId && bp.PostId == post.PostId) 
    ) 
    .ToListAsync(); 

Hier ist, wie ich es in zwei Abfragen, um Contains Basis zu verwenden, tun würde, auf den Informationen, die Sie zur Verfügung gestellt.

var postIds = await _context.BlogPost 
    .Where(bp => bp.BlogId = blogId) 
    .Select(bp => bp.PostId) 
    .ToArrayAsync(); 
var posts = await _context.Post 
    .Where(p => postIds.Contains(p.PostId)) 
    .ToListAsync(); 

Hier ist, wie ich es in einer Abfrage tun würde, wenn ich wertvolle EntityFramework Funktionen verwendet haben, und ich hatte eine Referenz Eigenschaft namens Beitrag auf Blogpost.

var posts = await _context.BlogPost 
    .Where(bp => bp.BlogId == blogId) 
    .Select(bp => bp.Post) 
    .ToListAsync(); 

Hier ist, wie ich es in einer Abfrage tun würde, wenn ich wertvolle EntityFramework Funktionen verwendet haben, und ich hatte eine Sammlung Eigenschaft namens Beiträge aus dem Blog, und die vielen vielen Blogpost Tabelle von EntityFramework in eine solche versteckt So, dass Sie nie wirklich mit C# interagieren.

var posts = await _context.Blog 
    .Where(b => b.BlogId == blogId) 
    .SelectMany(b => b.Posts) 
    .ToListAsync(); 

Auf der anderen Seite, wenn die viel viel Blogpost Tabelle von EntityFramework ausgesetzt ist, dann könnte man im Blog startet noch und richtig konfigurierte Sammlung und Referenzobjekte verwenden wie so an die Pfosten zu erhalten.

var posts = await _context.Blog 
    .Where(b => b.BlogId == blogId) 
    .SelectMany(b => b.BlogPosts) 
    .Select(bp => bp.Post) 
    .ToListAsync(); 

Oder

var posts = await _context.Blog 
    .Where(b => b.BlogId == blogId) 
    .SelectMany(b => b.BlogPosts.Select(bp => bp.Post)) 
    .ToListAsync(); 

Imbiss ist EntityFramework nicht SQL. Was Sie in SQL tun, kann oder kann nicht direkt zugeordnet werden oder sich sogar darauf beziehen, wie Sie in EntityFramework vorgehen würden. Nicht nur das, aber wenn Sie EntityFramework verwenden, verwenden Sie EntityFramework und C# -Sprachenfunktionen, die nicht EntityFramework per se sind, zum Beispiel LINQ. Die Aufschlüsselung des Problems in seine Bestandteile kann Ihnen dabei helfen, Probleme zu lösen und die Untersuchung komplexer Vorgänge zu erleichtern. LINQ isoliert zu lernen und zu üben, wird Ihnen dabei helfen, mit EntityFramework besser zu werden.

+0

I aktualisiert diese nach dem Code erneut zu lesen. Ich sehe jetzt, dass Sie versuchen, die Kategorie zurückzugeben, zu der ein Beitrag gehört, und nicht eine Liste von Beiträgen, die zu einer Kategorie gehören. –

+0

Ich habe die Namen der Datenbanktabellen geändert, um sie verständlicher zu machen. Ich versuche, eine Liste der Beiträge zu einer Kategorie zu erhalten (Blog ist die Kategorie der Beiträge) – QuanDar

+0

Danke für die Klärung. Ich habe eine Reihe von Beispielen hinzugefügt, um Sie über EntityFramework und LINQ nachzudenken, und ermutige Sie hoffentlich, sich Zeit zu nehmen, um einige Online-Kurse zu beiden Technologien zu studieren und/oder anzusehen. –

0

Sie können einen Join für die Post-zu-Blog-Beziehung und dann eine Where-Klausel als Blog-Filter verwenden.

var query = from post in _context.Post 
    join blogCat in _context.BlogPost on post.PostId equals blogCat.PostId 
    where blogCat.BlogId == blogId 
    select post; 

var result = await query.ToListAsync(); 

Diese

SELECT * 
FROM Post 
WHERE PostId IN (
    SELECT PostId FROM BlogPost WHERE BlogId = &id); 
0

EDITED auf Ihrem Sql in der Spitze des Codes basiert

Sie .Select()

var blog = await _context.Blogs.FirstOrDefaultAsync(b => b.Id == blogId); 
var posts = blog ?? blog.BlogCategory.Select(bp => bp.Post); 

verwenden Ich denke, Sie Navigationseigenschaft haben in BlogBlogCategory können Sie diese hilfreich link

2

LINQ Abfrage

from p in _context.Post 
where _context.BlogCategory.Any 
       (bc => bc.PostId == p.PostId 
        && bc.BlogId == &id 
       ) 
select p; 

SQL

SELECT * 
FROM Post 
WHERE PostId IN (
SELECT PostId FROM BlogCategory 
WHERE BlogId = &id); 

ODER

SELECT * 
FROM Post p 
WHERE EXISTS 
    (
     SELECT 1 FROM BlogCategory 
     WHERE PostId = p.PostID AND BlogId = &id 
    );