EF Core und ThenInclude mit GenericRepository

  • WPF MVVM
  • .NET 5–6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von kaifreeman.

    EF Core und ThenInclude mit GenericRepository

    Hallo Leute,

    ich hab hier ein Problem mit der Implementierung von ThenInclude in einem Generic Repository. Ich gebe es ehrlich zu ich glaube in dem Fall reichen meine Fähigkeiten einfach nicht aus :(
    Ich verwende aktuell EF Core 2.0 und versuche eben von einem Objekt eine Navproperty mit Include und darin wieder eine NavProperty mit ThenInclude zu laden.
    Im alten EF Core ging so ein Konstrukt:

    C#-Quellcode

    1. query = query.Include(x => x.OfferHeads);
    2. query = query.Include(x => x.OfferHeads.Select(y => y.OfferPositions));


    Das führ aber zu:

    The expression 'x.OfferHeads.AsQueryable().Select(y => y.OfferPositions)' is invalid inside an 'Include' operation, since it does not represent a property access: 't => t.MyProperty'. To target navigations declared on derived types, use casting ('t => ((Derived)t).MyProperty') or the 'as' operator ('t => (t as Derived).MyProperty'). Collection navigation access can be filtered by composing Where, OrderBy(Descending), ThenBy(Descending), Skip or Take operations. For more information on including related data, see go.microsoft.com/fwlink/?LinkID=746393.


    Im Ef Core gibt es ja eigentlich für solche Konstrukte das .ThenInclude, da ich aber eine generische Implementierung verwende und nicht direkt das Repository zugreife, steht mir ThenInclude in meiner Business Logic nicht zur Verfügung.

    Darum hab ich mir versucht eine Extension zu basteln:

    C#-Quellcode

    1. public static IQueryable<TEntity> ThenInclude<TEntity>(this IQueryable<TEntity> queryable, string previousprop, string prop) where TEntity : class
    2. {
    3. return queryable.ThenInclude(previousprop: previousprop, prop: prop);
    4. }
    5. public static IQueryable<TEntity> ThenInclude<TEntity,TPrevProperty, TProperty>(this IQueryable<TEntity> queryable, Expression<Func<TEntity, TProperty>> predicate)
    6. where TEntity : class
    7. where TProperty : class
    8. {
    9. return EntityFrameworkQueryableExtensions.ThenInclude(queryable, predicate);
    10. }


    Leider bin ich irgendwie nicht in der Lage die Extension so zu formulieren das es klappt... kann mir jemand einen Schups in die richtige Richtung geben? Danke
    mfG.
    Stephan
    Hallo

    Das würde mich auch interessieren, das habe ich bei einem meiner Projekt damals auch nicht hinbekommen.

    Ich hatte es dann so gelöst das ich die Includes in einer Überladung der Extension über einen String angeben konnte:

    VB.NET-Quellcode

    1. <Extension>
    2. Public Function Include(Of TEntity As Class)(queryable As IQueryable(Of TEntity), prop As String) As IQueryable(Of TEntity)
    3. Return EntityFrameworkQueryableExtensions.Include(Of TEntity)(queryable, navigationPropertyPath:=prop)
    4. End Function


    Anwendung dann so: ​q = q.Include("UserRole.Rights.UserRight")

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Also wenn unser WPF Guru das nicht geschafft hat, dann wird das problematisch. Ich habe jetzt sehr viele Tage mit Recherche verbracht anscheinend gibt es da wirklich keine bessere Lösung als die benannte. Ich wollte eigentlich Strings zur Identifikation vermeiden aber wenn es nicht anders geht dann soll es so sein. Danke für deinen Tipp Sascha.

    @Bluespide
    ja ThenInclude ist generisch, ich habe es blöd formuliert. Im Context selbst ist ThenInclude verfügbar und generisch. Ich verwende aber ein generisches Repository und kein „typisiertes“ daher steht mir ThenInclude nicht zur Verfügung.
    mfG.
    Stephan
    Hallo

    Die Strings kannst du aber mittels SteingBuilder und nameOf auch zusammensetzen, dann hast du wieder die Compilerprüfung.

    Grüße
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##

    Da haste recht... Eigentlich macht es ja keinen Unterschied ob man .Include().ThenInclude() verwendet oder über Strings anspricht, wenn sich die Entitäten ändern hat man sowieso ein größeres Thema.
    Danke für eure Hilfe.
    mfG.
    Stephan