【问题标题】:Linq query for multiple join tables in C#C#中多个连接表的Linq查询
【发布时间】:2019-02-21 15:06:08
【问题描述】:

在我的应用程序中,我必须编写一个查询来显示来自多个表的数据。换句话说,我必须创建一个查询来连接多个表,并显示来自该查询的所需信息。 查询必须显示特定(选择的)工作人员的所有事件(以及DataGrid 中有关事件的所有数据)。

这是我的 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;

其中 strSplit 是一个特定的(选择的)工人。

DataGrid 的 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_objects,因为我需要这样做,因为我认为连接表 tbl_object_has_tbl_eventsApp.glidus 没有显示这样的表。

这是我的数据库的 ERD:

【问题讨论】:

  • 如果您在 Visual Studio 中打开数据库的 dbml 文件,tbl_objects_has_tbl_events 类是否出现?如果是这样,您能否打开生成的 Designer.cs 类,复制 tbl_objects_has_tbl_events 类并将其粘贴到您的问题中?另外,如何手动或通过工具(例如 sqlmetal)生成 dbml 文件?
  • 嗨,实际上我使用的是 ADO.NET Entity Framework 并生成 EDMX 文件,而不是 DBML。我通过 Visual Studio Whizard 获得的 EDMX 文件,我在其中设置 SQL Server 实例,选择 DB 并选择此 DB 中的所有表。之后它会生成 ERD,我可以通过自动生成的类访问表。

标签: c# linq


【解决方案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;

更新:

此外,查看您的 xaml,您正在尝试绑定到匿名类型中未返回的属性。例如d2.damagedVacantionStart - 你还没有返回整个d2 对象,所以不能绑定到它上面的其他属性,不能访问d2

尝试通过返回查询中所需的确切属性并直接绑定到这些属性来简化事情。例如

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

然后在您的 xaml 中,您可以使用简单的绑定表达式:

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

【讨论】:

  • 我的查询代码返回异常 entityCommandExecutionException。
  • @Toucki - 你的代码还是我的?查看 innerException 以查看它是否包含有关导致异常的原因的更多信息。您不需要手动执行所有这些连接 - 这是使用 Linq to Entities 的部分好处。它提供表之间的导航属性并在后台处理连接。在编写查询时,intellisense 应该可以帮助您确定导航属性的名称。
  • @Geoff Appleford,我的代码返回异常,我会检查您的解决方案并写下结果。谢谢。
  • 您所说的是否也与 ADO.NET Entity Framework 相关?我正在使用这种方式与 DB(EDMX 文件)进行交互。
  • 问题是我们无法访问关联类(存储两个不同表的主键的连接表) we.tbl_event.tbl_objects_has_tbl_events.select(e => e.tbl_object) 我们可以' t 触摸此连接表,我们甚至在 Visual Studio 2010 图表查看器的 ERD 中都看不到此表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
相关资源
最近更新 更多