2011-02-16 3 views
1

제 애플리케이션에서 여러 테이블의 데이터를 표시하는 쿼리를 작성해야합니다. 즉, 여러 테이블에 대한 조인을 만들고이 쿼리에서 원하는 정보를 표시하는 쿼리를 만들어야합니다. 쿼리는 특정 (선택한) 작업자에 대한 모든 이벤트 (및 DataGrid의 이벤트에 대한 모든 데이터)를 표시해야합니다. strSplit 특정 (선택) 노동자입니다C#의 다중 조인 테이블에 대한 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; 

: 여기

내 LINQ의 코드입니다. 데이터 그리드의

XAML 코드 :

<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> 

, 지금이 변형 값을 반환하지 않습니다,이 쿼리를 해결하는 방법을 도와주세요.

연결 테이블 tbl_object_has_tbl_events 및 App.glidus가 그러한 테이블을 표시하지 않아야한다고 생각하기 때문에 쿼리의 tbl_objects에 연결할 수 없습니다. (나는 당신의 탐색 속성이 호출됩니다 정확히 모르겠어요)

DB ERD

+0

:

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

예를 들어

는 그런 다음 XAML에서 당신은 간단한 바인딩 식을 수 있을까요? 그렇다면 생성 된 designer.cs 클래스를 열고 tbl_objects_has_tbl_events 클래스를 복사하여 질문에 붙여 넣을 수 있습니까? 또한 dbml 파일을 손으로 또는 도구 (예 : sqlmetal)를 통해 어떻게 생성합니까? –

+0

안녕하세요, 실제로는 ADO.NET Entity Framework를 사용하고 DBML이 아닌 EDMX 파일을 생성합니다. EDMX 파일 Visual Studio Whizard에서 SQL Server 인스턴스를 설정하고 DB를 선택하고이 DB의 모든 테이블을 선택합니다. 그 후 ERD가 생성되고 자동 생성 클래스를 통해 테이블에 액세스 할 수 있습니다. –

답변

1

이런 식으로 뭔가를 시도 :

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; 

업데이트 여기

내 데이터베이스의 ERD입니다 :

또한 xaml을 보면 retu가 아닌 속성에 바인딩하려고합니다. 너를 익명으로 판다. 예 : d2.damagedVacantionStart - 전체 d2 개체를 반환하지 않았으므로 d2에 대한 액세스 권한이없는 다른 개체에 바인딩 할 수 없습니다.

쿼리에 필요한 정확한 속성을 반환하고이를 직접 바인딩하여 작업을 단순화 해보십시오. 당신은 Visual Studio에서 데이터베이스의 DBML 파일을 열면 클래스 tbl_objects_has_tbl_events이 표시되지 않거나,

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

내 쿼리 코드에서 예외 entityCommandExecutionException을 반환합니다. –

+0

@ 토우 키 - 코드 또는 광산? innerException을 조사하여 예외의 원인에 대한 자세한 정보가 있는지 확인하십시오. 이러한 모든 조인을 수동으로 수행 할 필요가 없습니다. 즉, Entity에 Linq를 사용하면 얻을 수있는 이점 중 일부입니다. 테이블 간의 탐색 속성을 제공하고 커버 아래의 조인을 처리합니다. 쿼리 작성시 intellisense는 탐색 속성이 호출되는 것을 해결하는 데 도움이됩니다. –

+0

@ Geoff Appleford, 내 코드 returhs 예외, 귀하의 솔루션을 확인하고 결과에 대해 쓸 것입니다. 감사. –

관련 문제