Question

J'ai une question liée à celle-ci . Je ne veux pas faire de calcul (agrégation), mais je dois obtenir les valeurs d'affichage d'une association. Dans mon code C #, je peux directement référencer la valeur, car la contrainte de clé étrangère a obligé Linq à générer tout le câblage nécessaire. Lorsque je spécifie IQueryable en tant que propriété de source de données Gridview et que je fais référence à quelque chose qui n'est pas une colonne de l'entité principale dans le jeu de résultats, j'obtiens une erreur indiquant que la colonne n'existe pas. En tant que novice à Linq, je suppose que la tâche convertit implicitement l'IQueryable en liste et que les associations sont perdues. Ma question est la suivante: quel est le bon moyen de le faire?

Je suppose que je peux contourner ce problème en écrivant une requête parallèle renvoyant un type anonyme contenant toutes les colonnes dont j'ai besoin pour la vue en grille. Il semble que, ce faisant, je garderais les données en mémoire de manière redondante que je possède déjà. Puis-je interroger à la volée les structures de données en mémoire lors de l'attribution de la source de données? Ou existe-t-il une solution plus directe?

La grille est censée afficher les associations de groupes médicaux du médecin, et le nom de l'association est dans une table de recherche.

            IQueryable<Physician> ph =
                        from phys   in db.Physicians
                        //from name   in phys.PhysicianNames.DefaultIfEmpty()
                        //from lic    in phys.PhysicianLicenseNums.DefaultIfEmpty()
                        //from addr   in phys.PhysicianAddresses.DefaultIfEmpty()
                        //from npi    in phys.PhysicianNPIs.DefaultIfEmpty() 
                        //from assoc  in phys.PhysicianMedGroups.DefaultIfEmpty()
                        where phys.BQID == bqid
                        select phys;

 alt text
(source: heeroz.com )

Donc, sur la base de la réponse de Denis, j'ai supprimé toutes les informations inutiles de ma requête. J'ai pensé que je ne poserais peut-être pas la bonne question.

Quoi qu'il en soit, la page affiche les données d'un médecin. Je souhaite afficher toutes les affiliations de groupes médicaux dans une grille (et laisser l'utilisateur insérer, modifier et mettre à jour des affiliations). Je réalise maintenant que je n'ai pas besoin de participer explicitement à ces autres tables - Linq le fait pour moi. Je peux accéder au numéro de licence, qui se trouve dans un tableau séparé, en le référençant via la chaîne d'associations d'enfants. Je ne peux pas faire référence au nom du groupe médical dans gridview, ce qui me ramène à ma question:

AffiliationGrid.DataSource = ph.First().PhysicianMedGroups;

Ceci ne fonctionne pas car med_group_print_name n'est pas accessible pour GridView:

A field or property with the name 'med_group_print_name' was not found on the
selected data source.

Encore une fois, supportez-moi, s'il est trop évident que je ne comprends pas Linq ... parce que je ne le comprends pas.

Était-ce utile?

La solution

Votre requête semble étrange. Vous devriez essayer d'afficher simplement

ph = from phys in db.Physicians
     where phys.BQID == bqid
     select phys;

dans votre grille. Cela devrait fonctionner. Aussi, pourquoi les appels à Load ()? Si le DataContext n'est pas supprimé lorsque la grille est liée, vous ne devriez pas en avoir besoin.

Si vous avez toujours des problèmes, pouvez-vous s'il vous plaît poster le message d'erreur que vous obtenez, cela aiderait ...

Partie 2

Le problème est que vous avez le nom n'est effectivement pas dans le PhysMedGroup. Vous devez naviguer d’un niveau jusqu’à MedGroupLookup pour accéder au nom, car il s’agit d’une propriété de cette classe.

En fonction de la technologie utilisée (il semble que ce soit WinForms ou Web Forms), vous devrez configurer votre liaison de données pour accéder à MedGroupLookup.med_med_group_print_name.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top