好的。原来是 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。