我有一个非常奇怪的问题要问。
我需要6个表来获取数据:
TEMPLATE
TEMPLATE_INDEX
TABLE_1
TABLE_2
TABLE_3
TABLE_4
模板与另一个表(INTEREST)有一个FK,用作获取数据的密钥。这是一对多的关系,1 INTEREST有很多TEMPLATE
表格的链接方式
TEMPLATE <----- TEMPLATE_INDEX
TEMPLATE_INDEX <----- TABLE_1
TEMPLATE_INDEX <----- TABLE_2
TEMPLATE_INDEX <----- TABLE_3
TEMPLATE_INDEX <----- TABLE_4
我试图下载所有与加载UserControl时选择的INTEREST有关的数据(我不知道这是不是一个好主意,但我的想法是,会有更少的查询需要数据时的数据库。)
我试过在VB.NET中这样做
dim temp_listing = From q In context.TEMPLATE _
Join t In context.TEMPLATE_INDEX On t.TEMPLATE_ID Equals q.ID
Join t1 In context.TABLE_1 On t1.TEMPLATE_INDEX_ID Equals t.ID
Join t2 In context.TABLE_2 On t2.TEMPLATE_INDEX_ID Equals t.ID
Join t3 In context.TABLE_3 On t3.TEMPLATE_INDEX_ID Equals t.ID
Join t4 In context.TABLE_4 On t4.TEMPLATE_INDEX_ID Equals t.ID
Select q, t, t1, t2, t3, t4
temp_listing.Load()
但并非所有数据都已下载。
任何人都可以告诉我如何做到这一点吗?
我之所以这样做是因为数据库不是本地的。很多时候,在用户完成某些操作后,相关信息需要一段时间才能显示。我认为加载时间较长并使程序运行顺利很容易,因为所有数据都是本地的(即context.TABLE_1.Local)
如果有人,有一个更好的解决方案,我全心全意。
感谢。
答案 0 :(得分:1)
首先要注意的是,应该避免LINQ语句中的Join
语句到SQL后端。它是冗长的,几乎总是你可以(并且应该)使用导航属性做同样的事情。
我怀疑这里的问题是INNER JOIN
。与OUTER JOIN
相反,它仅返回连接两侧都存在的数据。
取而代之的是,使用带有导航属性的Include
语句:
From q In context.Template
.Include(t => t.TEMPLATE_INDEX.TABLE_1)
.Include(t => t.TEMPLATE_INDEX.TABLE_2)
.Include(t => t.TEMPLATE_INDEX.TABLE_3)
.Include(t => t.TEMPLATE_INDEX.TABLE_4)
Select q
这将转换为外连接。
第二个注意事项是,通常在一次往返中获取数据是个好主意。但是你必须在这里做一些基准测试。使用&#34;很多&#34;的查询连接有一种方法可以在长度和宽度上炸毁结果集。最后,您可能会通过线路发送过多的数据,所花费的时间远远少于几次单独的往返发送数据。