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 句に何を渡すかは問題ではなく、常にすべてのレコードがサブセレクトで最初に取得されます。これは、必要なビューに対してクエリを実行した場合にのみ発生しますが、作成する予定のクエリではなく、上記のクエリを作成する理由に興味がありましたか? これは Entity Framework の問題ですか、それとも MySql の問題ですか?

4

1 に答える 1

1

MySql View では、使用するクエリで動的フィルターを使用できません。
これを達成するために使用されるハックはほとんどありません。しかし、設計上、mysql ビューは本質的に動的ではありません。例で述べたように、ビューは常に提供された実際のクエリを実行し、その結果に対してのみ、さらにフィルタリングを行うことができます。詳しくはこちら

于 2013-07-24T18:12:32.197 に答える