2017-09-27 6 views
0

J'ai une couche DAL qui contient un EF Dbcontext et des entités. J'ai un service qui contient une méthode où je veux faire un simple choix qui vient de la couche logique.Func <T, dynamic> to Func <TEntité, dynamique>

couche: Logic => DalService => DbContext.DbSet.Select (quelque chose)

DAL ne connaît pas tous les modèles DTO. La couche logique ne connaît aucune entité.

Je suis essentiellement essayer de convertir: Func<T, dynamic> sélecteur à sélecteur Func<TEntity, dynamic> que je peux utiliser essentiellement sur un DbSet<TEntity>.

Merci

+1

FWIW, je considérerais votre architecture être quelque chose d'un anti-modèle, et je suppose que vous faites cela pour séparer les préoccupations ou faire les tests unitaires plus facile . Votre couche "Logique" doit accéder directement au contexte DbContext, afin de réduire le besoin d'intergiciels complexes tels que ceux que vous recherchez. Cette couche doit ensuite mapper tous les résultats aux modèles DTO si nécessaire. –

+1

C'est peut-être 'Expression >' au lieu de 'Func '? – ASpirin

+1

Voir cette question pour une exigence similaire: https://stackoverflow.com/questions/2797261/mutating-the-expression-tree-of-a-predicate-to-target-another-type –

Répondre

2

AutoMapper a une fonction appelée Expression Translation qui peut faire le travail de traduction de vos requêtes de la couche logique à vos requêtes DAL.

D'abord, vous devez configurer une application de TEntity (votre type d'entité de votre DAL) à T (votre DTO de votre couche logique):

Mapper.Initialize(cfg => cfg.CreateMap<TEntity, T>()); 

Puis, lorsque votre DAL reçoit une expression de requête de la couche logique comme dans cet exemple:

Expression<Func<DTO, dynamic>> logicExpression = (dto) => new { dto.SomeProperty }; 

il peut traduire comme ceci:

var dalExpression = Mapper.Map<Expression<Func<TEntity, dynamic>>>(logicExpression); 

Enfin, pour être invoqué contre votre contexte EF:

var results = context.SomeSet.Select(dalExpression).ToList(); 
+0

Oui, correct. Cependant, les moyens dynamiques que je suis en train de: méthode: dynamique GetMyModelById (id longue, Func f) {} Utilisation: GetMyModelById (1, f => new {f.code, f.name}) – MrH40XX

+1

'AutoMapper' cartes ** données **, il ne mappe pas une expression ou lambda. – Maarten

+1

Je ne cherche pas automapper. Je suis à la recherche d'une cartographie dynamique. Je veux un objet anonyme que je définis sur la couche logique. Je veux obtenir l'entité mais pas tous les champs. Puisque mon entité contient beaucoup de champs, je veux juste en sélectionner quelques-uns. Je n'ai pas envie de faire 100 modèles et 100 méthodes différentes où seuls les champs sélectionnés sont différents. – MrH40XX