Entity Framework – Obtenir l’entité par son nom

J’ai le code suivant (exemple):

public dynamic GetData(ssortingng name) { using(var ctx = GetObjectContext()) { switch (name) { case "entity1": return ctx.entity1.ToList(); case "entity2": return ctx.entity2.ToList(); ...... default: return null; } } } 

Je veux éviter de passer dans cet exemple. Comment puis-je trouver le nom de la classe d’entité requirejse, appeler la méthode ToList () et renvoyer des données? Puis-je faire cela en utilisant la reflection? Pouvez-vous m’aider?

Vous pouvez le faire en utilisant la reflection. Cependant, vous aurez également besoin d’utiliser des génériques, car le type de liste renvoyé par la méthode ToList () est différent pour chaque type d’entité.

Vous pouvez accéder à un getter de propriété par reflection comme ceci:

 var enumerable = typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null); 

Considérant que [ClassNameOfContext] est le nom de la classe dont ctx est une instance. Ce n’est pas évident dans votre code, mais vous le savez 🙂

Le problème est que enumerable sera un object et doit être converti en IEnumerableEntityType est le type d’entité EntityType vous accédez. En d’autres termes, cela dépend du nom que vous passez. Si vous utilisez des génériques pour déterminer le type, vous pourrez correctement transtyper l’object et ne pas avoir à renvoyer une dynamic .

 public TEntity Get(ssortingng name) { ... 

et transformer la ligne d’en haut:

 var enumerable = (IEnumerable)(typeof([ClassNameOfContext]).GetProperty(name).GetValue(ctx, null)); return enumerable.ToList(); 

Voici!

Addendum: Vous pourriez également supprimer le paramètre ssortingng – évitez autant que possible d’avoir des noms de types ou de propriétés dans les chaînes car ce n’est pas sûr. Le compilateur ne le reconnaît pas et les fonctionnalités de l’EDI telles que les refactorings n’en tiennent pas compte. Le problème ici est que les noms de propriété sont généralement la forme plurielle des noms de type d’entité. Mais vous pouvez utiliser la reflection pour trouver la propriété dont le type correspond à TEntity . Je laisse cela comme un exercice 🙂

Vous pouvez utiliser un code comme celui-ci

 private IEnumerable GetList(ssortingng connectionSsortingng, Func caster) { using (var ctx = new DbContext(connectionSsortingng)) { var setMethod = ctx.GetType().GetMethod("Set").MakeGenericMethod(typeof(T)); var querable = ((DbSet)setMethod .Invoke(this, null)) .AsNoTracking() .AsQueryable(); return querable .Select(x => caster(x)) .ToList(); } } 

Pour appeler comme ça:

 var branchList = GetList("connectionSsortingngName", x => (Branch)x); 

Vous pouvez supprimer .AsNoTracking () et .ToList (). Vous obtiendrez ainsi un IQueryable pur que vous pourrez interroger davantage.