2017-11-28 4 views
2

Ich habe diese Abfrage mit Entity Framework Core (v2), aber die Include/ThenInclude funktionieren nicht wie erwartet. Dies ist die Abfrage:Include funktioniert nicht nach SelectMany + Select in Entity Framework Core

var titlesOwnedByUser = context.Users 
        .Where(u => u.UserId == userId) 
        .SelectMany(u => u.OwnedBooks) 
        .Select(b => b.TitleInformation) 
        .Include(ti => ti.Title) 
        .ThenInclude(n => n.Translations); 

Die Abfrage funktioniert, aber die Titel, die ich mit Titel Set null bekommen kommen.

Nur zur Klarstellung die Klassen sind diese

class User 
{ 
    public int Id { get; set; } 
    public List<BookUser> OwnedBooks { get; set; } 
} 

class Book 
{ 
    public int Id { get; set; } 
    public TitleInformation TitleInformation { get; set; } 
    public List<BookUser> Owners { get; set; } 
} 

class BookUser 
{ 
    public int BookId { get; set; } 
    public int UserId { get; set; } 
    public Book Book { get; set; } 
    public User User { get; set; } 
} 

class MyContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<BookUser>() 
      .HasOne(x => x.User) 
      .WithMany(x => x.OwnedBooks) 
      .HasForeignKey(x => x.UserId); 

     modelBuilder.Entity<BookUser>() 
      .HasOne(x => x.Book) 
      .WithMany(x => x.Owners) 
      .HasForeignKey(x => x.BookId); 
    } 
} 

class TitleInformation 
{ 
    public int Id { get; set; } 
    public Title Title { get; set; } 
    public Title Subtitle { get; set; } 
} 

class Title 
{ 
    public int Id { get; set; } 
    public string OriginalTitle { get; set; } 
    public List<Translation> Translations { get; set; } 
} 

Was muss ich tun, um die Übersetzungen Last in der zurück abfragbar zu machen?

+0

Können Sie die Konfiguration für Entitäten anzeigen? –

+0

Sounds wie [Ignoriert enthält] (https://docs.microsoft.com/en-us/ef/core/querying/related-data). Sie sollten die Abfrage anders herum erstellen, ausgehend von 'context.TitleInformation'. –

+0

@Herzl bitte überprüfen Sie das Update OP. – SuperJMN

Antwort

5

Dies ist aktuelle EF-Core Begrenzung im Loading Related Data - Ignored includes beschrieben:

Wenn Sie die Abfrage ändern, so dass es nicht mehr Instanzen des Entity-Typ zurückgibt, die die Abfrage mit begann, dann werden die Include Betreiber ignoriert.

Entsprechend müssen Sie die Abfrage von context.Set<TitleInformation>() starten. Aber, um die gewünschte Filterung zu erzeugen, müssen Sie inverse Navigationseigenschaft TitleInformation-Book, die derzeit in Ihrem Modell fehlt:

class TitleInformation 
{ 
    // ... 
    public Book Book { get; set; } // add this and map it properly with fluent API 
} 

Wenn Sie es haben, Sie so etwas wie diese verwenden:

var titlesOwnedByUser = context.Set<TitleInformation>() 
    .Include(ti => ti.Title) 
     .ThenInclude(n => n.Translations) 
    .Where(ti => ti.Book.Owners.Any(bu => bu.UserId == userId)); 

oder im Falle der Beziehung zwischen TitleInformation und Book ist eine eins-zu-viele (obige ist für eins-zu-eins):

class TitleInformation 
{ 
    // ... 
    public List<Book> Books { get; set; } 
} 

bzw.

var titlesOwnedByUser = context.Set<TitleInformation>() 
    .Include(ti => ti.Title) 
     .ThenInclude(n => n.Translations) 
    .Where(ti => ti.Books.SelectMany(b => b.Owners).Any(bu => bu.UserId == userId)); 
Verwandte Themen