动态LINQ从关系表中选择

时间:2013-12-04 02:57:49

标签: c# .net sql linq entity-framework

我有一个包含中央表的数据库,其中有超过30个表由FK引用。一个条目在主表中总是有一行,并且根据信息的类型,可能是1或2(我目前无法想到它在2个以上的任何场景)的关联表。 / p>

根据客户的不同,只有正在填充的表会显示给最终用户,他们可以动态选择将哪些信息列返回给他们。

我正在使用Entity Framework来访问记录,并且发现了所有引用表的速度困境。如果我只是做一些事情:

var v = from r in context.Records
select r;

当它执行查询时,它还会为每个关联的表执行子查询,无论它是否有条目。当在一个状态良好的本地局域网上,它速度快,但有明显的延迟。远程运行这些查询时,每条记录大部分时间都需要运行所有相关查询。相关查询的示例位于此帖的底部。我创建了一个实体模型,它只有一些表而不是用于演示目的的完整集,并从EF获得了日志输出。我只粘贴了1个记录查询集的输出。

因此,我的想法是使用linq将

的内容放在一起
var v = from r in context.Records
        select new { ID = r.ID, val1 = r.val1, val2=r.val2, val3 = r.child_table1.val1, r.child_table1.val2 };

就删除不需要的查询的开销和删除性能问题而言,这完全符合我的要求....(这是我目前卡住的地方)。

但是,child_table和列名称是必须是动态的部分。我将始终拉出主表的列,但我需要动态创建与相关表中的列相关的选择部分。

例如,客户可能只有3个正在填充的子表,因此不需要其余的子表。但是,由于我们在世界各地拥有众多客户,所以每个人都不同,所以编写每个可能的场景都是不切实际的,也不可维护,因为我们总是需要处理新事物来更新/添加。

因此,对于我的正常情况,我需要2-4个子表,以及每个子表的所有列。我可以管理从ui呈现的列。最大的挑战是只查询实际上有行的子表。

希望我过度思考这个,有人会给我一个时刻。

非常感谢任何想法或提示。

由于

    SELECT 
    [GroupBy1].[A1] AS [C1]
    FROM ( SELECT 
        COUNT(1) AS [A1]
        FROM [dbo].[records] AS [Extent1]
    )  AS [GroupBy1]
-- Executing at 11/29/2013 9:03:02 PM -05:00
-- Completed in 20 ms with result: SqlDataReader

SELECT TOP (128) 
    [Extent1].[ID] AS [ID], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[records] AS [Extent1]
    ORDER BY [Extent1].[ID] ASC
-- Executing at 11/29/2013 9:03:02 PM -05:00
-- Completed in 67 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---] AS [Extent1]
    WHERE [Extent1].[RecordID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 25 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
        [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---2] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 20 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
        [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---3] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 18 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---4] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 30 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---5] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 23 ms with result: SqlDataReader

SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---], 
    [Extent1].[---] AS [---]
    FROM [dbo].[meta_---6] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1
-- EntityKeyValue1: '1' (Type = Int64)
-- Executing at 11/29/2013 9:03:03 PM -05:00
-- Completed in 18 ms with result: SqlDataReader

0 个答案:

没有答案