2013-07-19 25 views
8

我有一个表叫PersonTable与列:PersonId, RestarauntId, Age为什么实体框架在从视图中选择时创建子查询?

我有一个叫PersonView认为做:

select PersonId, 
     RestarauntId, 
     RestarauntName(RestarauntId) as `RestarauntName`, 
     Age 
FROM PersonTable 

当我做的简单的东西:

var persons = context.PersonView.Where(x=>x.PersonId == 1) 
           .Select(x=> 
            new {x.PersonId, 
             x.RestarauntId, 
             x.RestarauntName, 
             x.Age }); 

以上返回1条记录,我期望MySql查询是:

SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView 
WHERE PersonId = 1 

而是,它生成以下内容:

SELECT 1 AS `C1`, T.PersonId, T.RestarauntId, T.RestarauntName, T.Age 
FROM 
(SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView) AS T 
WHERE T.PersonId = 1 

所以没关系我传递给where子句,它总是会先得到所有的记录在子选择。这只发生在我查询需要的视图时,但我很好奇它为什么会创建上述查询而不是我期望它创建的查询?这是一个实体框架问题还是一个MySql问题?

+0

MySQL是否无法针对同一计划优化两个查询?也许在运行时差异并不重要。 – usr

+2

http://stackoverflow.com/questions/12690775/why-ef-generating-a-sub-query-for-a-simle-query –

+1

我不知道它是否有帮助,但EF不会使用关键信息在视图上确定联接类型。它只在表格上选择使用内部连接,而不是在视图上。 – Brannon

回答

1

MySql View不允许在查询中使用动态过滤器。
有几个黑客用来实现这一点。但通过设计,mysql视图本质上不是动态的。视图总是执行提供的实际查询,并且仅在该结果上进行进一步筛选,如您在示例中所述。有关更多详细信息,请访问Here