it-swarm.com.de

Fragen Sie eine Viele-zu-Viele-Beziehung mit linq/Entity Framework ab. Code zuerst

Wie kann ich eine Viele-zu-Viele-Beziehung mit Entity Framework-Code und Linq abfragen? Das Problem ist, dass EF automatisch die Beziehungstabelle erstellt. Ich habe es also nicht in meinem Kontext.

Dies ist das relationale Modell:

enter image description here

Ich brauche eine Liste von Artikeln für eine bestimmte Category_Id.

select a.Id, a.Title,a.ShortDescription                       
from Articles a
join CategoryArticles ca on ca.Article_Id=a.Id
where ca.Category_Id  = @parameter

Mein dbcontext hat jedoch nur:

public DbSet<Article> Articles { get; set; }
public DbSet<Category> Categories { get; set; }.

Danke für jede Hilfe.

32
D.B

Du kannst das:

var cat_id=1; // Change this variable for your real cat_id

var query= from article in db.Articles
           where article.Categories.Any(c=>c.Category_ID==cat_id)
           select article;

Auf diese Weise erhalten Sie die Artikel, die die gewünschte Bedingung erfüllen. Dies ist der SQL-Code, der von dieser Abfrage generiert wird:

    SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title]
    FROM [dbo].[Articles] AS [Extent1]
    WHERE  EXISTS (SELECT 
        1 AS [C1]
        FROM [dbo].[ArticleCategories] AS [Extent2]
        WHERE ([Extent1].[Id] = [Extent2].[Article_Id]) AND ([Extent2].[Category_Id] = @p__linq__0))

Aktualisieren

Eine andere Option wäre die Verwendung der Erweiterungsmethode SelectMany (wie @Khaled darauf hinweist), indem Sie Ihre Abfrage von Categories statt von Articles starten:

var query= db.Categories.Where(c=>c.Category_ID==cat_id).SelectMany(c=>Articles);

Das würde einen Inner Join erzeugen, anstelle der EXIST, die ein Produkt der Any-Erweiterungsmethode ist.

37
octavioccl

Wie wäre es mit

db.Categories.Where(c => c.Id == categoryId).SelectMany(c => c.Articles)?

Das sollte gut funktionieren (die rechts verbundene SQL-Anweisung erzeugen.) 

6
Khaled Rashad

Ich bin einfach nur darauf gestoßen und habe gedacht, ich würde die Lösung posten, die ich für alle gefunden habe, die über diese Seite stolpern. Dies erzeugt einen INNER JOIN.

var category_id = 24;

var query = (from article in Articles
             from category in article.Categories.Where(x => x.Category_ID == category_id)
             select article);
2
JOpuckman

Beispiel für eine Linq-Methodensyntax

int category_ID = 1;

var query = db.Articles
    .Where(a => a.Categories
    .Any(c => c.Category_ID == category_ID))
    .ToList();
2
Mauricio Ferraz

Wenn Sie nur möchten, dass die gesamte Tabelle alle Beziehungen enthält, versuchen Sie Folgendes:

List<CategoryArticle> rec = context.Category.SelectMany(a => a.Articles.Select(c => new CategoryArticle { Category_Id = c.Id, Article_Id = a.Id })).ToList();
1
juanora

Fügen Sie die Junction-Tabelle hinzu und fragen Sie sie ab:

  var articles = (from ca in _context.CategoryArticles
                  inner join a in _context.Articles on a.Id equals ca.Article_Id
                  inner join c in _context.Catgories on c.Id equals ca.Category_Id
                  where ca.Category_Id equals catId
                  select c).ToList();
0
user10728126