EF Core 6部署至Azure后自动添加WHERE 1=0子句致查询无结果
EF Core自动生成WHERE 1=0条件导致查询无结果(本地正常,Azure异常)
问题现象
将代码从本地服务器迁移至Azure后,多数查询返回0条结果,但CountAsync能正确返回总记录数。通过SQL Profiler发现EF Core自动为部分查询添加WHERE 1 = 0条件,代码中未手动设置该过滤。
示例代码中,CountAsync返回总记录数为2,但ToListAsync返回空数组(数据库实际存在2条记录):
public async Task<PagedResultDTO<ApplicationOrganizationDTO>> GetAll(PaginationInputDTO<Guid> input) { try { var query = _context.ApplicationOrganizations.AsQueryable(); if (!string.IsNullOrEmpty(input.SortBy)) { query = input.SortType.Equals("DESC")? query.OrderByDescending(x => x.EnglishName):query.OrderBy(x=>x.EnglishName); } int recordsToSkip = (input.PageNumber - 1) * input.PageSize; int recordsToTake = input.PageSize; var records = await query.Skip(recordsToSkip).Take(recordsToTake).ToListAsync(); var result = new PagedResultDTO<ApplicationOrganizationDTO> { Results = _mapper.Map<List<ApplicationOrganizationDTO>>(records), TotalRecords = await query.CountAsync() }; return result; } catch (Exception ex) { throw; } }
SQL Profiler捕获的生成查询:
SELECT [a].[Id], [a].[ActivationDurationInDays], [a].[ActivationStatus], [a].[ArabicName], [a].[CreationDate], [a].[EnglishName], [a].[LastEditDate], [a].[PhoneNumber], [a].[ShortName], [a].[Website] FROM [ApplicationOrganizations] AS [a] WHERE 0 = 1
已核对后端模型与数据库Schema完全一致,本地环境运行正常,需无需修改代码的解决方案。
无需修改代码的排查与解决步骤
- 清除EF Core查询缓存:重启Azure应用服务,强制EF Core重新生成查询计划,避免旧缓存导致的错误查询逻辑。
- 检查Azure SQL兼容性级别:对比本地数据库与Azure SQL的兼容性级别(本地可通过
SELECT compatibility_level FROM sys.databases WHERE name = 'YourDB'查询),将Azure SQL的兼容性级别调整为与本地一致(例如本地为150对应SQL Server 2019,Azure中通过Azure Portal或ALTER DATABASE YourDB SET COMPATIBILITY_LEVEL = 150修改)。 - 验证数据库连接目标:确认Azure环境的连接字符串指向的数据库与本地为同一份备份,且表的架构(如dbo)一致,避免因连接到错误数据库/架构导致EF无法匹配数据而生成
WHERE 1=0。 - 重置Azure SQL查询计划:使用具有权限的账号执行
DBCC FREEPROCCACHE清除服务器级查询缓存,或针对特定表执行UPDATE STATISTICS ApplicationOrganizations更新统计信息,强制重新生成正确的查询计划。 - 检查应用配置差异:对比本地与Azure环境的
appsettings.json或Azure应用配置,确认是否存在EF Core相关的全局查询过滤器配置(如HasQueryFilter)被意外启用。
内容的提问来源于stack exchange,提问作者Abdulaziz Burghal
相关产品推荐
相关产品推荐

