2009-05-03 7 views
2

J'ai une question liée à this one. Je ne veux pas faire un calcul (agrégation), mais j'ai besoin d'obtenir des 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 fait Linq générer tout le câblage nécessaire. Lorsque je spécifie IQueryable comme propriété de source de données Gridview et 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 débutant à Linq, je devine que le devoir convertit implicitement le IQueryable à une liste, et les associations sont perdues. Ma question est, quelle est une bonne façon de faire cela?Source de données Linq to SQL et Gridview

Je suppose que je peux contourner cela en écrivant une requête parallèle retournant un type anonyme qui contient toutes les colonnes dont j'ai besoin pour la grille. Il semble que ce faisant, je garderais en mémoire les données en mémoire que j'ai déjà. Puis-je interroger les structures de données en mémoire à la volée lors de l'attribution de la source de données? Ou y a-t-il une solution plus directe?

La vue de 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 consultation.

  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 http://heeroz.com/phys.jpg

Ainsi, en fonction de la réponse de Denis, j'ai enlevé tous les trucs inutiles de ma requête. J'ai pensé que je ne pose peut-être pas la bonne question pour commencer.

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 les affiliations). Je réalise maintenant que je n'ai pas besoin de me joindre explicitement à ces autres tables - Linq fait cela pour moi. Je peux accéder au numéro de licence, qui est dans un tableau séparé, en le référençant à travers la chaîne des associations d'enfants. Je ne peux pas référence au nom du groupe médical dans le gridview, ce qui me ramène à ma question:

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

Cela ne fonctionne pas, car med_group_print_name n'est pas accessible pour le GridView:

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

Encore une fois, ours avec moi, si tout est trop évident que je ne comprends pas Linq ... parce que je ne comprends pas.

Répondre

1

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 éliminé lorsque la grille est liée, vous ne devriez pas en avoir besoin.

Si vous avez encore des questions, 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 est effectivement pas dans le PhysMedGroup . Vous devez naviguer d'un niveau vers le MedGroupLookup pour accéder au nom, puisqu'il s'agit d'une propriété de cette classe. Selon la technologie que vous utilisez (il semble que ce soit WinForms ou Web Forms), vous devrez configurer votre liaison de données pour accéder à MedGroupLookup.med_group_print_name.

+0

Oui J'ai pensé que les charges pourraient ne pas être nécessaires. J'ai révisé ma question. – cdonner

+0

ou, plutôt, le fera bientôt. – cdonner

+0

Puis j'obtiens ceci: Un champ ou une propriété avec le nom 'MedGroupLookup.med_group_print_name' est introuvable sur la source de données sélectionnée. – cdonner