好的。原来是 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。它包括 MySQL.Data 和 MySQL.Data.Entities,都在版本 6.7.4 中。
但是,我还为 Visual Studio 1.0.2 安装了 MySQL,以便能够使用比 Visual Studio 中的代码更多的 GUI。但是这个东西带有相同的 dll,只是在不同的(旧)版本 6.6.5 中。当应用程序运行时,这些优先于较新的。(首先奇怪的是,在同一个 MySQL 安装程序中,同一个 dll 有两个相互冲突的版本。)
无论如何,我删除了 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 安装程序中有两种不同版本的 dll,一种覆盖另一种。我正在使用 mysql-installer-community-5.6.13.0。