好的。事實證明,這是MySQL的問題。 我正在使用實體框架的查詢,後來變成數據庫特定的SQL。我這種情況下MySQL。所以,在EF中的查詢是:
var query3a = from TGosc gosc in context.TGosc
where gosc.TRezerwacja
.Any(x => x.TPlatnosc
.Any(y => y.Kwota > 100000))
select new { gosc.IdGosc, gosc.TOsoba.Imie, gosc.TOsoba.Nazwisko };
現在,我的應用程序中的提供者是Connector NET 6.7.4。它包括版本6.7.4中的MySQL.Data和MySQL.Data.Entities。
但是,我還爲Visual Studio 1.0.2安裝了MySQL,以便能夠使用比Visual Studio中的代碼更多的GUI。但是這個東西帶有相同的dll,只是在不同的(舊的)版本6.6.5中。這些應用程序在運行時優先於新的應用程序。 (奇怪的是,在同一個MySQL安裝程序中,有兩個相同的DLL的某些衝突版本。)
無論如何,我刪除了MySQL for Visual Studio 1.0.2,這讓我留下了更新的DLL,並看到會發生什麼情況十分相同的LINQ to Entities查詢,當它被翻譯爲DB SQL:
--old 6.6.5
SELECT
Extent1.IdGosc,
Extent2.Imie,
Extent2.Nazwisko
FROM TGosc AS Extent1
INNER JOIN TOsoba AS Extent2 ON Extent1.IdGosc = Extent2.IdOsoba
WHERE EXISTS(
SELECT 1 AS C1
FROM (
SELECT Extent3.IdRezerwacja
FROM TRezerwacja AS Extent3
WHERE Extent1.IdGosc = Extent3.IdGosc) AS Project1
WHERE EXISTS(
SELECT 1 AS C1
FROM TPlatnosc AS Extent4
WHERE (Project1.IdRezerwacja = Extent4.IdRezerwacja)
AND (Extent4.Kwota > 100000)))
VS
-- new 6.7.4
SELECT
Extent1.IdGosc,
Extent2.Imie,
Extent2.Nazwisko
FROM TGosc AS Extent1
INNER JOIN TOsoba AS Extent2 ON Extent1.IdGosc = Extent2.IdOsoba
WHERE EXISTS(
SELECT 1 AS C1
FROM TRezerwacja AS Project1
WHERE EXISTS(
SELECT 1 AS C1
FROM TPlatnosc AS Extent4
WHERE (Project1.IdRezerwacja = Extent4.IdRezerwacja)
AND (Extent4.Kwota > 100000))
AND Extent1.IdGosc = Project1.IdGosc)
這是simila回到Gordon Linoff在這篇文章中回答的問題。中間子查詢消失。 當然,新的查詢工作正常!
總結一下,我猜是MySQL提供商。NET在這些版本上變得更好。我仍然有一些查詢導致類似的問題,但現在我想我知道這是爲什麼 - 提供商。我確定。
惱人的是,在MySQL安裝程序中有兩個不同版本的dll,一個覆蓋另一個。我正在使用mysql-installer-community-5.6.13.0。
不幸的是,會給不同的結果。 SELECT'Extent3'.'IdRezerwacja'子查詢將在整個TGosc表上運行,而不是上部子查詢(通過加入TOsoba)減少的內容。 順便說一句,這不是我創建查詢。它是實體框架。 –
好的。我對此很陌生,但正在努力幫助。 – Navya