Ok。MySQLの問題であることが判明しました。私はEntity Frameworkのクエリを使用しています。これは後でdb固有の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 のコードよりも多くの GUI を使用できるように、Visual Studio 1.0.2 用の MySQL もインストールしました。しかし、これには同じ dll が付属していますが、異なる (古い) バージョン 6.6.5 だけです。そして、アプリケーションが実行されているとき、これらは新しいものよりも優先されました。(そもそも、同じ MySQL インストーラーに同じ dll の競合するバージョンが 2 つあるというのは奇妙です。)
とにかく、私は Visual Studio 1.0.2 の MySQL を削除しました。これにより、新しい dll が残り、db sql に変換されているときに、まったく同じ LINQ to Entities クエリがどうなるかを確認しました。
--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)))
対
-- 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)
これは、Gordon Linoff がこの投稿で回答したものと似ています。中間のサブクエリが消えます。そしてもちろん、新しいクエリは正常に動作します!
要約すると、.NET 用の MySQL プロバイダーは、これらのバージョンよりも優れていると思います。私はまだ同様の問題を引き起こすいくつかのクエリを持っていますが、今ではその理由がわかっていると思います-プロバイダー. 私はそれで大丈夫です。
煩わしいことは、MySQL Installer に 2 つの異なるバージョンの dll があり、一方が他方をオーバーライドしていることです。私は mysql-installer-community-5.6.13.0 を使用しています。