7
votes

Déclaration laid de Linq, une meilleure façon?

J'ai une instruction LINQ qui ajoute les valeurs de plusieurs colonnes, chaque commençant par "HH", bien qu'il existe d'autres colonnes disponibles: xxx

existe-t-il un moyen de ranger ça ? Je dois faire beaucoup de variations de ceci (dans différentes méthodes) afin qu'il éliminerait beaucoup de "peluchons" si cela pourrait être.

aussi j'aimerais appeler .gevalueordfault ( ) sur chaque colonne, mais j'ai actuellement pris cela en raison du désordre, à l'exception des deux dernières colonnes.

suggestions très appréciés!


7 commentaires

Les valeurs que vous devez ajouter toujours la même chose? Alors toujours HH01, HH16, HH17, ...?


Quel fournisseur LINQ utilisez-vous?


@Wouterdekort: Je devine non, voyant comme il doit faire des variations ...


@Farligopptreden Je voulais dire si c'est X = HH01 + HH02, Y = HH03 + HH01. Alors vous pouvez déplacer x et y pour être propriétés sur e


Les HH, etc. sont toutes des colonnes différentes, dont je dois faire des variations (sinon ils sont juste des chiffres non liés). J'utilise Linq vers des entités avec un backend Oracle.


Dans quelles situations ces colonnes se modifient-elles? Est-ce lorsque le schéma de base de données change, ou à l'exécution? Si c'est le premier, vous pourrez peut-être générer le code. Si c'est ce dernier, il y a ensuite une façon d'obtenir la liste des noms de colonnes?


La colonne définit le changement en fonction de l'opération requise. Donc, si je peux la méthode1, cela ne sera calculé que en utilisant HH1 et HH2, mais une autre méthode peut utiliser d'autres colonnes.


3 Réponses :


2
votes

Je suppose que vous pouvez utiliser des réflexions pour cela: xxx pré>

puis utilisez-le comme suit: p>

return (from e in Data
        where e.SD == date
        select e).ToList().Select(x => GetHHSum(x)).FirstOrDefault();


6 commentaires

Cela ne fonctionnera pas, car le fournisseur ne sait pas comment traduire gethsum sur SQL.


J'ai édité ma réponse. Ce n'est pas que cela n'essaiera pas de le traduire en SQL, mais utilisez simplement une extension Helper Linq pour sélectionner les bonnes choses.


Oh, oui, désolé. S'il vous plaît, marque comme réponse, si cela a aidé. Merci.


Je n'ai pas posé cette question, je viens de souligner les problèmes de votre réponse ;-)


Légère amélioration. Changer en typeof (t) .geproperties (). Où (p => p.name.startswith ("hh")) et il n'y a pas besoin de vérifier cela dans le pour boucle.


+1 cosmin. La réflexion est d'environ 1000 fois plus lentement que le code statique



2
votes

Je me tromperai peut-être parce que je ne connais pas vos données, mais il me semble qu'ils ne sont pas complètement normalisés (attributs répétitifs). Vous pouvez envisager d'aller à la 3ème forme normale - ainsi créer une table distincte contenant une valeur par ligne - puis de rejoindre vos 2 tables dans votre requête LINQ.

La requête de liaison sera beaucoup mieux meilleure et vous pourrez ultérieurement changer vos champs HH sans changer vos requêtes.


3 commentaires

Les données n'ont rien à voir avec moi, j'ai simplement eu une table de base de données (que je ne peux de modifier ni de modifier de quelque manière que ce soit) et avoir à extraire les données telles quelles


Il n'y a rien dans le code posté qui montre que les données ne sont pas normalisées


COSMIN: En effet, ma réponse est basée sur de nombreuses hypothèses. Ce qui m'a conduit, c'est l'utilisation du terme "colonne" dans la question. En outre, avec l'expérience, il est facile de reconnaître ce type de problèmes et de les résoudre à la racine (les données)



1
votes

Une suggestion est de refactoriser le code ci-dessus pour utiliser des chaînes de méthode LINQ et des lambdas (préférence personnelle), puis extraire la sélection de Lambda sélectionnée dans une méthode distincte. Par exemple: xxx pré>

En plus si vous vouliez appeler getvalueordfault () sur chaque propriété HHXX, vous pouvez envelopper cela dans une autre fonction d'assistance. Cela revient vraiment à la préférence de coder. Lequel préfères-tu? Voir .gevalueordfault () à la fin de chaque accès de propriété ou une fonction qui l'entoure? par exemple. P>

return Get(x.HH01) + Get(x.HH16) + Get(x.HH17) + Get(x.HH18) ... 

private static HClassType Get(HClassType input)
{ 
    return input.GetValueOrDefault();
} 


0 commentaires