2017-01-31 3 views
2

Terrain:Filtrage DbSet non-générique expression construite dynamiquement

J'ai une classe mis en œuvre comme une façade dans le contexte Entity Framework DB. Il a été développé pour maintenir la compatibilité descendante, il imite la classe avec la même interface publique, mais utilise les DTO au lieu des entités EF.

Problème:

J'ai méthode suivante à l'intérieur de la classe décrite ci-dessus. Voir le code ci-dessous:

public IQueryable<T> FindBy<T>(Expression<Func<T, Boolean>> predicate) where T : BaseDto { 

//GetDestinationType takes source type of some declared mapping and returns destination type 
var entityType = Mapping.Mapper.GetDestinationType(typeof (T)); 

var lambda = Expression.Lambda(predicate.Body, Expression.Parameter(entityType)); 

// dbContext declared as class field and initialized in constructor 
var query = dbContext.Set(entityType).Where(lambda); // <-- Cannot use non-generic expression/lambda 

return query.ProjectTo<T>(mapper.ConfigurationProvider); } 
  1. Je dois prendre l'expression en utilisant DTO comme dans le paramètre et retourner IQueryable où T: BaseDto suite
  2. je dois convertir prédicat d'entrée au même prédicat en utilisant des entités EF comme dans le paramètre
  3. J'ai besoin de filtrer EF DbSet non générique avec l'aide d'expression créée dynamiquement (prédicat)

question principale

Est-il possible de filtrer EF DBSet non générique avec l'aide d'expression créée dynamiquement (sous-jacente)

S'il vous plaît me donner un peu de colle ou d'autres instructions si je dois utiliser une autre approche.

Répondre

0

Le problème a été résolu. La solution était assez évidente. Au lieu de

var query = dbContext.Set(entityType).Where(lambda); 

Je peux écrire

var query = dbContext 
       .Set(entityType) 
       .ProjectTo<T>(mapper.ConfigurationProvider) 
       .Where(predicate); 

prédicat est le paramètre d'entrée du procédé findBy().

Ce code sera compilé avec succès et, ce qui est plus important, EF construira une requête optimale à la base de données qui inclura la clause Where() dans le corps de la requête, donc ne prendra pas l'ensemble complet .

+0

Ceci utilise AutoMapper, correct? –

+0

@ChrisHaines oui, correct –