9

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

4

1 回答 1

1

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

于 2013-07-24T18:12:32.197 回答