实体框架查询 - 从子表返回唯一值

时间:2014-02-18 08:37:59

标签: entity-framework linq-to-entities unique

我有如下的Entity Framework模型和相应数据库表中的数据:

Entity Model

问题:如何有效地查询模型以返回给定人员的唯一sales_type实体? (person_sales表非常大,~1BN行,其他表相对较小)

示例:我想知道一个人“John”的所有独特sales_types。这里的答案将返回3个独特的项目:“内部”,“外部”和“混合”。

1 个答案:

答案 0 :(得分:0)

您肯定需要person_id列的person_sales列索引。查询会看起来像这样

var salesTypes = (from p in db.person
                  join ps in db.person_sales on p.id equals ps.person_id
                  join sm in db.sales_mapping on ps.sales_mapping_id equals sm.id
                  join st in db.sales_types on sm.sales_type_id equals st.id
                  where p.name == "John"
                  select st.sales_name).Distinct();

生成的SQL将如下所示:

SELECT
    [Distinct1].[sales_name] AS [sales_name]
    FROM ( SELECT DISTINCT [Extent4].[sales_name] AS [sales_name]
           FROM  [dbo].[person] AS [Extent1]
           INNER JOIN [dbo].[person_sales] AS [Extent2] 
                 ON [Extent1].[id] = [Extent2].[person_id]
           INNER JOIN [dbo].[sales_mapping] AS [Extent3] 
                 ON [Extent2].[sales_mapping_id] = [Extent3].[id]
           INNER JOIN [dbo].[sales_types] AS [Extent4] 
                 ON [Extent3].[sales_type_id] = [Extent4].[id]
           WHERE N'John' = [Extent1].[name]
    )  AS [Distinct1]