为什么实体框架在从视图中选择时会创建子查询?

Xai*_*oft 9 c# mysql linq-to-entities entity-framework .net-3.5

我有一个PersonTable用列调用的表:PersonId, RestarauntId, Age

我有一个名为的视图PersonView:

select PersonId, 
       RestarauntId, 
       RestarauntName(RestarauntId) as `RestarauntName`, 
       Age 
FROM PersonTable
Run Code Online (Sandbox Code Playgroud)

当我做一些简单的事情:

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

上面返回1条记录,我希望MySql查询是:

SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView
WHERE PersonId = 1
Run Code Online (Sandbox Code Playgroud)

但相反,它会生成以下内容:

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
Run Code Online (Sandbox Code Playgroud)

所以我传递给where子句并不重要,它始终会在子选择中首先获得所有记录.这只发生在我查询我需要的视图时,但我很好奇为什么它创建上述查询而不是我期望它的那个?这是实体框架问题还是MySql问题?

Akh*_*hil 1

MySql View 不允许在查询中使用动态过滤器。
几乎没有什么技巧可以实现这一点。但根据设计,mysql 视图本质上不是动态的。视图始终执行提供的实际查询,并且仅根据该结果,可以进行进一步的过滤,正如您在示例中提到的。欲了解更多详情,请访问这里