我对数据库以及如何显示有关主键和外键的信息有疑问。
例如,有三个表; Employees
,Employee_tickets
和Employee_comments
。
每个employee
可以包含多个tickets
和多个comments
。外键放在Employee票证和Employee Comments表中。我的应用程序是使用Visual Studio在vb.net中构建的,它是一个桌面应用程序。我如何查询说..员工姓名(' Jon Doe')并在网格中显示他的所有门票以及人们随时间对他做出的所有评论?我在sql数据库上创建了一个View,它返回了我需要的所有信息,但是对于每个单独的票证的View显示和Employee Name,列出了(' Jon Doe')下的每个票证。有没有办法只显示一次员工姓名,然后再显示该特定个人下面的每张票,而不再显示员工姓名,或者我是否必须将单独的窗口分隔所有这些?
这似乎是一个非常愚蠢的问题,我不能为我的生活找出如何正确显示在这种情况下所需要的。
以下是我要解释的示例:
因此,对于troy,在Employee Names表中输入了一个员工姓名,在CWB表中输入了一个CWB票证,但在PQR票证表中输入了两个PQ卡。我怎样才能为Troy显示一行,为他的CWB只显示一行,因为表中只输入了一行,然后是他名下的PQR卡的两行?
我创建了一个视图,将这些信息全部收集到一个视图中,然后将datagridview绑定到此视图。
答案 0 :(得分:2)
您的问题与数据库无关。相反,问题在于您有一个实体(员工),它有两个与之关联的独立集合(票证和评论),并且您希望显示两个集合的内容。
在数据网格中执行此操作很困难,因为在其最简单的版本中,它旨在显示一个类似项目的集合。
我可以想到许多可能性:
您的数据库结构是正确的,所以不要改变它,您只需要解决演示问题。
答案 1 :(得分:0)
您在这里缺少的是视图和模型之间的控制器。您的视图正好呈现了呈现的内容 - 您可以对其进行格式化。
有几种可能的解决方案,正确的解决方案部分取决于需求和基础设施。
如果您的基础架构稳固并且您的需求接近实时,请考虑单独查询以根据第一个表中选择的内容填充您的第二个和第三个表。这将增加数据库的负载,但您的数据几乎总是正确的,数据将以您希望的方式来自数据库。
如果以数据库为中心的解决方案对您不利,LINQ提供了一些很好的方法来将您的数据过滤到类型集合中,这些集合可以准确呈现您希望用户看到的内容。
获取用户:
Dim users = From l In data.lines
Group By FirstName = l.firstName, LastName = l.lastName
Into Tickets = Group, Count()
然后,您可以将此对象呈现给网格。虽然动态类型在这里工作,但我认为管理与已定义类的视图交互会更容易。我会把那部分留给你。在LINQ上做一些搜索以填补剩下的空白。它非常整洁。