2011-02-16 5 views
1

Dans mon application, je dois écrire une requête qui affiche les données d'un certain nombre de tables. En d'autres termes, je dois créer une requête qui fera une jointure pour le nombre de tables et montrera l'information désirée de cette requête. La requête doit afficher tous les événements (et toutes les données concernant les événements dans DataGrid) pour un worker spécifique (choisi).Requête Linq pour plusieurs tables de jointure en C#

Voici un code de mon LINQ:

IList dataList = (from dWorker in App.glidusContext.tbl_workers 
     where dWorker.workerTZ == strSplit 
     join d2 in App.glidusContext.tbl_workers_has_tbl_events 
     on dWorker.workerID equals d2.workerID 
     join dEvent in App.glidusContext.tbl_events 
     on d2.eventID equals dEvent.eventID 
     join dAct in App.glidusContext.tbl_activities 
     on d2.eventID equals dAct.eventID 
     select new { d2.damagedVacantionEnd, dEvent, dAct }).ToList(); 

return dataList; 

Où StrSplit est un travailleur spécifique (choisi).

XAML code de DataGrid:

<DataGrid.Columns> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_Event_type}" 
     Width="130" 
     IsReadOnly="True" 
     Binding="{Binding Path=dEvent.tbl_eventsType.eventTypeName}" /> 
    <DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_Classification}" 
     Width="130" 
     Binding="{Binding Path=dEvent.tbl_eventsClassification.eventClassificationName}" /> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_Catagory}" 
     Width="130" 
     Binding="{Binding Path=dEvent.tbl_eventsCategories.eventCategoryName}" /> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_Evacuation}" 
     Width="130" 
     Binding="{Binding Path=d2.damagedEvacuationDescription}" /> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EvacuationStart}" 
     Width="130" 
     Binding="{Binding Path=d2.damagedVacantionStart}" /> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_EvacuationEnd}" 
     Width="130" 
     Binding="{Binding Path=d2.damagedVacantionEnd}" /> 
<DataGridTextColumn Header="{x:Static res:Resources.WinSafetyByEmployee_DataGrid_ColHead_ActivityName}" 
     Width="*" 
     Binding="{Binding Path=dAct.activityName}" /> 
</DataGrid.Columns> 

S'il vous plaît, aider comment résoudre cette requête, maintenant cette variante ne retourne pas les valeurs.

Je ne peux pas non plus atteindre tbl_objects dans la requête car je dois le faire en pensant que la table de connexion tbl_object_has_tbl_events et App.glidus ne montrent pas une telle table.

Voici un ERD de mon DataBase:

DB ERD

+0

Si vous ouvrez le fichier dbml de votre base de données dans Visual Studio, ne les tbl_objects_has_tbl_events de classe apparaissent ou non? Si c'est le cas, pourriez-vous ouvrir la classe designer.cs générée, copier la classe tbl_objects_has_tbl_events et la coller dans votre question? Aussi, comment générer votre fichier dbml, à la main ou via un outil (sqlmetal par exemple)? –

+0

Salut, En fait, j'utilise ADO.NET Entity Framework et générer des fichiers EDMX, pas DBML. Fichier EDMX je reçois par Visual Studio Whizard, où je définis l'instance SQL Server, choisissez DB et sélectionnez toutes les tables dans cette base de données. Après cela, il génère ERD et je peux accéder à la table via des classes générées automatiquement. –

Répondre

1

Essayez quelque chose comme ça (je ne sais pas exactement ce que vos propriétés de navigation seront appelés):

IList dataList = (from we in App.glidusContext.tbl_workers_has_tbl_events 
        where we.worker.workerTZ == strSplit 
        select new { we.damagedVacantionEnd, 
           we.tbl_event, 
           we.tbl_event.tbl_activity}).ToList(); 

return dataList; 

Mise à jour :

Aussi, en regardant xaml, vous essayez de lier à des propriétés qui ne sont pas retu mis en boîte votre type anonyme. par exemple d2.damagedVacantionStart - vous n'avez pas retourné l'objet entier d2 donc vous ne pouvez pas lier à d'autres propriétés, pas accès à d2. Essayez de simplifier les choses en renvoyant les propriétés exactes dont vous avez besoin dans votre requête et en les reliant directement à celles-ci. par exemple

select new { VacStart = we.damagedVacantionStart, 
      VacEnd = we.damagedVacantionEnd, 
      EvTypeName = we.tbl_event.tbl_eventsType.eventTypeName, 
      ...}).ToList(); 

Ensuite, dans votre XAML vous pouvez avoir de simples expressions de liaison:

Binding="{Binding Path=evTypeName}" /> 
+0

Le code de ma requête renvoie l'exception entityCommandExecutionException. –

+0

@Toucki - Votre code ou le mien? Regardez le innerException pour voir s'il a plus d'informations sur ce qui a causé l'exception. Vous n'avez pas besoin de faire manuellement toutes ces jointures - cela fait partie des avantages d'utiliser Linq pour les entités. Il fournit les propriétés de navigation entre les tables et gère les jointures sous les couvertures. Lors de l'écriture de la requête, intellisense devrait vous aider à définir les propriétés de navigation appelées. –

+0

@ Geoff Appleford, Mon code returhs exception, je vais vérifier votre solution et écrira sur les résultats. Merci. –

Questions connexes