使用LINQ从多个表中选择所有表

时间:2014-08-26 09:21:06

标签: vb.net linq entity-framework

我有一个非常奇怪的问题要问。

我需要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)

如果有人,有一个更好的解决方案,我全心全意。

感谢。

1 个答案:

答案 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;的查询连接有一种方法可以在长度和宽度上炸毁结果集。最后,您可能会通过线路发送过多的数据,所花费的时间远远少于几次单独的往返发送数据。