0

Als Beispiel I Einheiten haben folgende (many-to-many, ich unnötigen Requisiten auch entfernt):einschliessen arbeiten nicht mit beitreten Einheiten

public class Buffet 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

public class Recipe 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public int CategoryId {get; set;} 
    public virtual Category Category {get; set;} 
} 

public class Category 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

Einheit Registriert:

public class BuffetRecipe 
{ 
    public int BuffetId {get; set;} 
    public virtual Buffet Buffet {get; set;} 
    public int RecipeId {get; set;} 
    public virtual Recipe Recipe {get; set;} 
} 

Ich will bekommen Alle Rezepte, die zu einem bestimmten Buffet gehören, enthalten die Rezeptkategorie.

public IList<Recipe> GetRecipes(int buffetId) 
{ 
    return _dbContext.BuffetRecipes 
    .Where(item => item.BuffetId == buffetId) 
    .Include(item => item.Recipe) 
    .ThenInclude(item => item.Category) 
    .Select(item => item.Recipe) 
    .ToList(); 
} 

Die Liste, die ich bekomme, gibt immer Rezepte mit Prop Category = null zurück. Ich habe keine Lösung gefunden, um das Include() zusammen mit dem Select() zu arbeiten ...

Was mache ich falsch ??

UPDATE:

Ich kann es auf diese Weise funktioniert ... aber mein Gefühl sagt, dass dies kein guter Weg ist, weil ich 2 ToList haben() ruft ... aber jetzt habe ich Kategorie in meine Ergebnisse enthalten :

public IList<Recipe> GetRecipes(int buffetId) 
{ 
    return _dbContext.BuffetRecipes 
    .Where(item => item.BuffetId == buffetId) 
    .Include(item => item.Recipe) 
    .ThenInclude(item => item.Category) 
    .ToList() 
    .Select(item => item.Recipe) 
    .ToList(); 
} 
+0

Warum machst du es mit der 'BuffetRecipe'-Klasse statt den Sammlungen auf' Buffet' und 'Rezept'? Sie verlieren die Fähigkeit, zwischen den beiden zu reisen. Ihre 'BuffetRecipe'-Klasse wird als eine Tabelle erstellt, die Sie nicht in C# benötigen, um diese Viele-zu-viele-Beziehung zu verwalten. – krillgar

+1

Im EF-Kern gibt es keine Viele-zu-Viele ohne Join-Entity ... Also muss ich manuell eine BuffetRecipe-Entity erstellen, damit diese Art von Beziehung im neuen EF-Core funktioniert ... – Simon

+0

Ich möchte nur das hinzufügen include funktioniert ohne Select am Ende. Ist das Absicht? – Simon

Antwort

1

Include ist nur wirksam, wenn es bis zum Ende Ergebnis der Abfrage angewandt werden kann.

Sie könnte es in ändern ...

return _dbContext.BuffetRecipes 
    .Where(item => item.BuffetId == buffetId) 
    .Select(item => item.Recipe) 
    .Include(rcp => rcp.Category) 
    .ToList() 

... aber der Nachteil ist, dass Sie Ihre Recipe s duplizieren (so viele wie sie BuffetRecipes haben). Es ist besser, die Abfrage mit Recipe zu starten:

return _dbContext.Recipes 
    .Where(rcp => rcp.BuffetRecipes.Any(br => br.BuffetId == buffetId)) 
    .Include(rcp => rcp.Category) 
    .ToList(); 

Sie sehen, dass ich mir die Freiheit nahm eine Navigationseigenschaft Recipe.BuffetRecipes hinzuzufügen. Dies sollte kein Problem mit Ihrem Modell sein (im Gegenteil, würde ich sagen).

+0

Vielen Dank für Ihr Feedback ... aber ich muss Ihnen sagen, dass Ihre erste Abfrage nicht funktioniert ... was bedeutet, dass sie die Kategorie nicht enthält ... auch wenn ich das Include nach dem Select() setze. – Simon

+0

Ihre zweite Abfrage-Ergebnisse in SQL wie: SELECT xxxxxxxxxx FROM [Rezepte] AS [Artikel] INNER JOIN [RecipeCategories] AS [r] ON [Artikel] [CategoryId] = [r] [Id] WHERE EXISTS.. ( SELECT 1 FROM [BuffetRecipes] AS [br] WHERE ([br]. [BuffetId] = @__ buffetId_0) und ([Artikel]. [Id] = [br]. [RecipeId])) die aussieht nicht sehr gut zu mir :-( – Simon

+0

Das ist die Abfrage, die ich erwarten würde.Was die erste Abfrage anbelangt, kann man leider nie groß machen, was mit EF Core funktioniert, aber wie gesagt, ich mag die Abfrage sowieso nicht. –