Mam tabeli o nazwie PersonTable
z kolumnami: PersonId, RestarauntId, Age
Dlaczego struktura encji tworzy podzapytanie podczas wybierania z widoku?
mam pogląd zwany PersonView
że robi:
select PersonId,
RestarauntId,
RestarauntName(RestarauntId) as `RestarauntName`,
Age
FROM PersonTable
Kiedy robię coś tak prostego jak:
var persons = context.PersonView.Where(x=>x.PersonId == 1)
.Select(x=>
new {x.PersonId,
x.RestarauntId,
x.RestarauntName,
x.Age });
powyższych zwraca 1 rekord i oczekuję zapytania MySql:
SELECT PersonId, RestarauntId, RestarauntName, Age
FROM PersonView
WHERE PersonId = 1
ale zamiast tego, generuje następujące:
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
Więc to nie ma znaczenia, co ja przechodzę do klauzuli WHERE, to zawsze dostanie wszystkie rekordy pierwszy w sub-select. Dzieje się tak tylko wtedy, gdy pytam o widok, który potrzebuję, ale byłem ciekawy, dlaczego tworzy powyższe zapytanie zamiast tego, którego oczekuję. Czy jest to kwestia Entity Framework lub problem MySql?
Czy MySQL nie jest w stanie zoptymalizować obu zapytań do tego samego planu? Może różnica nie ma znaczenia w czasie wykonywania. – usr
http://stackoverflow.com/questions/12690775/why-ef-generating-a-sub-query-for-a-simle-query –
Nie wiem, czy to pomaga, ale EF nie użyje kluczowych informacji w widokach, aby określić typy łączenia. Wybiera tylko przy użyciu wewnętrznego sprzężenia w tabelach, nigdy w widokach. – Brannon