2016-12-02 13 views
3

Ich habe folgende many-to-many-BeziehungEF Core-many-to-many holen Abfrage

modellierten
public class Profile 
{ 
ICollection<Category> Categories { get; set;} 
// One-To-Many 
ICollection<Platform> Platforms { get; set; } 
} 

public class Category 
{ 
ICollection<Profile> Profiles { get; set; } 
} 

public class ProfileCategory 
{ 
public int ProfileId { get; set; } 
public Profile Profile { get; set; } 
public int CategoryId { get; set; } 
public Category Category { get; set;} 
} 

Ich bin mit ASP.NET MVC-Core und eine Filteransicht Modell, wo ein Filter auf einige Attribute auf Profilname und es funktioniert.

basierend auf Kategorie filtern Der Versuch erwies sich als viel schwieriger zu implementieren (zumindest die Lösung für mich nicht klar ist :)

Aus dem Web kann der Benutzer Null wählen, eine oder mehrere Kategorien so zu filtern, auf grundsätzlich Was an meinen Controller gesendet wird, ist eine Liste von Kategorie-IDs.

Von diesem Punkt ist das Profil-Objekt anders und andere Navigationseigenschaften wie Platforms ist null und damit andere Teile zu brechen.

Wie kann ich den Join ausführen, während die ursprüngliche Instanz des Profile-Objekts beibehalten wird? Ich dachte zuerst, dass sie gleich sein würden, aber ich lag falsch.

Antwort

2

Derzeit EF-Core-Joins sind nicht perfekt, und ich empfehle zwei Abfragen machen:

1) Wählen Sie die Liste von ProfileId (basierend auf Kategorienliste):

var profileIds = await _context.ProfileCategory 
    .Where(x => categoryIds.Contains(x.CategoryId)) // filtering goes here 
    .Select(x => x.ProfileId) 
    .Distinct() 
    .ToListAsync(); 

2) Wählen Sie den gewünschten Daten basierend auf bekannten IDs:

Ja, das sind zwei Abfragen statt einer, aber zwei einfache Abfragen, einfach mit Indizes optimiert.

+0

War so ziemlich der Ansatz, den ich nahm :) Danke für die schnelle Antwort! – joacar

Verwandte Themen