0
votes

Obtenez un enregistrement à partir de DB à l'aide de la réflexion et du type générique

Je veux récupérer une instance de DB. J'ai créé un modèle de dB utilisant ef. Je peux le faire de la manière statique: xxx

mais comment faire cela si la classe de la table actuelle change et parfois c'est Table1 et parfois table2? J'ai essayé quelque chose comme ça, mais évidemment, cela ne fonctionne pas: xxx

EDIT: La courante est une chaîne

Il y a 5 tables et chaque table a besoin différentes colonnes à vérifier. Donc, j'aurais une liste de colonnes à vérifier pour chaque table


12 commentaires

Vous pouvez utiliser db.currenttable.first (a = >.Column1 == colonneValue) . Êtes-vous essayé cela?


La carte courante est une chaîne


N'est-ce que deux tables ou potentiellement plus? Si seulement deux tables, il suffit de les interroger et de vérifier si les entités sont NULL :-)


Il y a 5 tables et chaque table a besoin de différentes colonnes à vérifier. Donc, j'aurais que la liste des colonnes soit vérifiée pour chaque table.


D'accord, pourriez-vous insérer une capture d'écran de vos tables et de leurs relations? Il pourrait y avoir de la place pour des améliorations structurelles :-)


Les colonnes sur les différentes tables ont-elles le même nom? et sont-ils cohérents?


Que je ne peux pas faire tristement. Et comment cela aiderait-il? Supposons que j'ai une table et nous ne connaissons pas son type. C'est tout ce dont j'ai besoin mais j'ai cherché et recherché et je ne trouve pas de solution autre que de faire des boîtes de commutation et de rédiger tout type de statique.


Avez-vous essayé de mettre en place une méthode générique avec un où T: YourentityTyPeclass ? La question est que chaque objet aurait besoin d'une colonne colonne1 .


Certains sont les mêmes, certains ne le sont pas. Les relations sont décrites dans la table de mappage à partir de laquelle je peux récupérer les noms de colonne nécessaires.


@ Passer7by cela pourrait aider car lorsque vous devez interroger plusieurs tables pour la même valeur, cela pourrait signifier que la conception de la DB pourrait être optimisée. N'essayez pas d'être impoli ici ici :-) Faites de plusieurs requêtes et de rechercher des valeurs NULL ou, comme la suggère de la FHCimolin, rendez votre méthode générique.


@Bomortensen je sais que vous n'êtes pas impoli. Désolé si je suis venu aussi défensif. Y a-t-il un autre APRACH? Parce que pour chaque table, je aura des colonnes différentes pour vérifier cet enregistrement spécifique.


@ Passer7by c'est tout bon :-) hmmn .. Vous devrez faire un peu de réflexion magique pour vérifier les colonnes de différence pour chacune des tables. Vérifiez d'abord si l'entité générique a une propriété de la valeur dont vous avez besoin pour vérifier, puis vérifier la valeur elle-même. Peut être préférable de simplement interroger la base de données pour toutes les tables nécessaires, puis effectuez vos bilans avec le résultat en mémoire.


4 Réponses :


2
votes

Je suggère de regarder Ce Réponse, devriez-vous vous inspirer.

En informatique, le code s'appuie sur des fonctions génériques, en passant un document LINQ FUNC CODE> pour déléguer le premier () code> (ou dans son Cas, le SmoorFault () CODE>) afin qu'il puisse exécuter la même méthode pour tout objet (ou table) envoyé à la méthode, comme le bas ci-dessous: P>

 public T Single<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression) where T:class {
        return GetObjectSet<T>().SingleOrDefault(expression);
    }


0 commentaires

1
votes

Cela pourrait aider: xxx pré>

sauf pour la vérification des colonnes.
Une solution possible pour l'ajout de la vérification des colonnes consiste à utiliser une classe mère contenant tous les champs participant à toutes les tables filtrant et modifie la deuxième ligne à ceci: p>

var result = ((IQueryable<ParentClass>)db.Set(entity)).First(a => a.column1 == columnValue);


0 commentaires

1
votes

si le cas est que vous strong> seulement strong> avez cinq tables avec la même colonne et que vous devez interroger la base de données pour chacune de ces tables pour cette colonne, puis après em> performer chèques contre le résultat sur différentes colonnes em>, puis je pense que je vais aller pour une solution d'embranchement plutôt que d'utiliser la réflexion.

donné cet exemple de tables: p>

using(var ctx = new MyDbContext())
{
    Table1 tbl1 = ctx.Table1s.FirstOrDefault(x => x.ColumnA == "myvalue");
    Table2 tbl2 = ctx.Table2s.FirstOrDefault(x => x.ColumnA == "myvalue");
    Table3 tbl3 = ctx.Table3s.FirstOrDefault(x => x.ColumnA == "myvalue");

    // Perform null checks and other checks against different columns here
} 


0 commentaires

2
votes

Assum de "colonne1" est une propriété commune, vous pouvez utiliser cette méthode: xxx

puis, en fonction de la base de données modifier la requête et obtenez la première ligne, ou de lancer au moment de l'exécution et d'utiliser Premier ().


0 commentaires