Comment puis-je implémenter plusieurs Inclure dans Entity Framework?

Aug 24 2020

J'utilise Entity Framework 6. J'ai un objet Transaction avec plusieurs propriétés de navigation. Il est facile d'implémenter le chargement hâtif à l'aide de plusieurs Inclure.

 var aa = db.Transactions.Include(p => p.Account).Include(p => p.Instrument);

Comment puis-je implémenter la même chose si les champs à inclure sont des paramètres?

var aa = db.Transactions.IncludeMore(delegatesToBeIncluded);   

Si delegatesToBeIncludedest nul, il n'y a rien à inclure.

https://stackoverflow.com/a/38823723/5852947 C'est similaire à ce que je veux mais il utilise une chaîne au lieu de délégués.

https://stackoverflow.com/a/35889204/5852947 Ceci est également intéressant.

Comment passer lambda 'include' avec plusieurs niveaux dans Entity Framework Core? Cela se concentre sur plusieurs niveaux (j'ai un niveau)

https://stackoverflow.com/a/52156692/5852947 C'est aussi prometteur.

Dans quelle direction dois-je aller?

Révision 1 : Pourquoi en ai-je besoin? Sur la base des éléments de aanouveaux objets seront créés. J'ai réalisé qu'à chaque création d'objet, EF lit la base de données (le chargement paresseux est utilisé). Ce n'est que 50 ms, mais il est répété n fois. Cette fonction est implémentée dans une classe de modèle, donc Transactions est également un paramètre.

Révision 2 : Dans le code complet, il y a filtrage (pagination pour être exact), et ToList () à la fin. La partie délicate qu'elle est implémentée dans une fonction de modèle. dbTableSelectorest un délégué:readonly Func<MainDbContext, DbSet<TDbTable>> dbTableSelector;

 var myList = dbTableSelector(db).Where(WhereCondition).
             Skip(numberOfSkippedRows).Take(PageSize).OrderBy(OrderByCondition).ToList();

Après cela, je transforme chaque élément de myListen un autre type d'objet. C'est là que le chargement différé est activé un par un pour chaque élément. C'est pourquoi j'essaye d'utiliser Include. Si dbTableSelector(db)retourne, Transactionsje dois inclure différents éléments quand il retourne, disons Instruments. Donc, IncludeMore doit avoir un paramètre List qui définit les champs à inclure.

Réponses

IstvanHeckl Aug 27 2020 at 08:58

Voici la solution. Il est basé sur ceci .

public static class IQueryableExtensions
{
    public static IQueryable<T> IncludeMultiple<T, TProperty>(this IQueryable<T> query,
        Expression<Func<T, TProperty>>[] includeDelegates) where T : class
    {
        foreach (var includeDelegate in includeDelegates)
            query = query.Include(includeDelegate);
        return query;
    }
}

C'est la vocation:

var pathsA = new Expression<Func<ViewTransaction, object>>[2] { p => p.Account, p => p.Instrument };
var pathsB = new Expression<Func<ViewTransaction, object>>[1] { p => p.Account};
var pathsC = Array.Empty<Expression<Func<ViewTransaction, object>>>();


var a = db.ViewTransactions.IncludeMultiple(pathsA).Single(e => e.Id == 100);