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:
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.
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))
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.
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.)
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);
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();
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();
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();