Entity framework - obtenir de l'entité par nom
J'ai le code suivant (exemple):
public dynamic GetData(string 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 basculer dans cet échantillon. Comment puis-je trouver nécessaire de l'entité de la classe par nom, appelez le ToList() la méthode et de données de retour? Puis-je faire cela à l'aide de la réflexion? Pouvez-vous m'aider?
OriginalL'auteur user1209216 | 2012-09-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en utilisant la réflexion, cependant, vous aurez également besoin d'utiliser des génériques, car le type de la liste retournée par la ToList() la méthode est différente pour chaque type d'entité.
Vous pouvez accéder à une propriété de lecture grâce à la réflexion de la sorte:
Alors que
[ClassNameOfContext]
est le nom de la classe qui ctx est une instance de. Ce n'est pas évident à partir de votre code, mais vous le savez 🙂Le problème est que
enumerable
sera unobject
et doit être castée pourIEnumerable<EntityType>
oùEntityType
est le type d'entité que vous accédez. En d'autres termes, cela dépend du nom que vous êtes de passage. Si vous utilisez des médicaments génériques afin de déterminer le type, vous serez en mesure de convertir l'objet et ne pas avoir à retourner undynamic
même.et de transformer la ligne de dessus:
ici vous allez!
Addendum: on pourrait, en théorie, de se débarrasser de la chaîne de paramètre, trop - le fait d'avoir des noms de types ou de propriétés dans les chaînes doivent être évités dans la mesure du possible, car il n'est pas sécurisé. Le compilateur ne le reconnaît pas, et IDE des fonctionnalités telles que les refactorings de ne pas en tenir compte. Le problème ici est que les noms de propriétés sont généralement le pluriel du type d'entité noms. Mais vous pouvez utiliser la réflexion pour trouver le bien immobilier dont le type correspond à la
TEntity
. Je laisse cela comme un exercice 🙂J'ai mis à jour ma réponse.
vous êtes à l'aide de dynamic pour contourner un problème car il me semble. Le
dynamic
mot-clé doit être utilisé consciemment. Il a son usage très spécifique les cas où il est raisonnable de les utiliser, mais dans votre cas, vous êtes parfaitement en mesure d'fortement du type de votre type de retour. C'est la meilleure façon d'aller.Désolé, j'ai toujours un peu confus. Qu'est-ce que "TEntity" et comment dois-je le déclarer? Je suis peu novice avec ce, donc j'ai besoin de le demander.
Je suis désolé, la partie la plus importante a été absent, a ajouté au code ciselée ci-dessus. C'est le
<TEntity>
. C'est des génériques. Lorsque vous appelez la méthode, vous devrez ajouter le type d'entité que vous souhaitez entre parenthèses, comme par exempleGetData<Rabbit>("Rabbits")
pour un cas fictif où vous avez Lapin entités. À l'intérieur de la méthode, Visual Studio va traiterTEntity
comme si c'était un type existant. À l'exécution, il est remplacé(-ish) par ce que vous appelez avec (Lapin, par exemple) Si vous ne connaissez pas les génériques encore, la lire sur le web. Il est important que les principes de base.OriginalL'auteur
Vous pouvez utiliser le code comme ceci
De l'appeler comme ceci:
Vous pouvez le supprimer .AsNoTracking() et remove .ToList(), puis vous obtenez un pur IQueryable que vous pouvez interroger davantage.
OriginalL'auteur