这是今天在实际项目中遇到的一个问题,Entity Framework Core 2.2 生成了下面的 SQL 语句,INNER JOIN 部分丑陋的 SQL 语句让人无法忍受。
SELECT TOP(@__p_1) [t].[ShortName] AS [EnterpriseShortName], [j].[Key], [j].[PositionName] FROM [JobPosition] AS [j] INNER JOIN ( SELECT [e].* FROM [Offer].[Enterprise] AS [e] WHERE [e].[IsActive] = 1 ) AS [t] ON [j].[EnterpriseKey] = [t].[Key] WHERE ((([j].[Status] = 1) AND ([t].[IsActive] = 1)) AND ([j].[ExpireDate] > GETDATE()))) AND ([j].[CategoryID] = @__categoryId_0)
使用的是标准的一对多(one-to-mant)映射关系,在其他项目都能生成赏心悦目的 SQL 语句,唯独今天这个项目中不行。
job.HasOne(j => j.Enterprise) .WithMany(e => e.Jobs) .HasForeignKey(j => j.EnterpriseKey);
这个项目与其他项目不同的地方是用了很多 HasQueryFilter ,比如
enterprise.HasQueryFilter(e => e.IsActive);
去掉上面的 HasQueryFilter 问题就解决了,改进后生成的 SQL 语句如下
SELECT TOP(@__p_1) [j.Enterprise].[ShortName] AS [EnterpriseShortName], [j].[Key], [j].[PositionName] FROM [JobPosition] AS [j] INNER JOIN [Offer].[Enterprise] AS [j.Enterprise] ON [j].[EnterpriseKey] = [j.Enterprise].[Key] WHERE ((([j].[Status] = 1) AND ([j.Enterprise].[IsActive] = 1)) AND ([j].[ExpireDate] > GETDATE()))) AND ([j].[CategoryID] = @__categoryId_0)
使用 HasQueryFilter 要小心这个小坑。