【问题标题】:Why does entity framework create a subquery when selecting from a view?为什么实体框架在从视图中选择时会创建子查询?
【发布时间】:2013-07-19 01:55:45
【问题描述】:

我有一个名为 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 问题?

【问题讨论】:

  • MySQL 不能将两个查询优化到同一个计划吗?也许差异在运行时并不重要。
  • 我不知道它是否有帮助,但 EF 也不会使用视图的关键信息来确定连接类型。它只选择在表上使用内连接,而不是在视图上。
  • @CharlieBrown - 非常感谢。我想这个问题有点像另一个问题。
  • 它似乎读取视图查询并将其视为子查询,我认为它最终会给您相同的性能。

标签: c# mysql entity-framework .net-3.5 linq-to-entities


【解决方案1】:

MySql View 不允许在查询中使用动态过滤器。
用于实现此目的的技巧很少。但是按照设计,mysql 视图本质上不是动态的。正如您在示例中提到的那样,视图始终执行提供的实际查询,并且只有在该结果上才能进行进一步的过滤。更多详情,请访问Here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多