EF Core中LINQ无法转换枚举类型的IN查询问题
枚举类型LINQ过滤无法转SQL的解决方法
你遇到的问题是EF Core无法将枚举类型的嵌套Any查询转换为SQL,导致只能被迫用客户端评估影响性能。核心问题出在你的过滤逻辑写法上:query.TypesExclus.Any(type => type != doc.TypeDocument)的逻辑是“只要TypesExclus里有任意一个元素不等于当前文档类型就保留”,这和你想要的“排除TypesExclus里所有类型的文档”完全不符,而且EF Core也没法把这种嵌套比较转换成SQL。
正确的写法应该用Contains方法取反,EF Core能直接把!Contains(...)转换成SQL的NOT IN,同时自动处理枚举到数据库存储值(比如整数)的转换:
if (query.TypesExclus.Any()) { documents = documents.Where(doc => !query.TypesExclus.Contains(doc.TypeDocument)); }
替换之后,EF Core会生成类似WHERE TypeDocument NOT IN (@p0, @p1, ...)的SQL语句,完全在数据库端完成过滤,不会有客户端评估的性能问题。
修正后的完整代码:
public async Task<GetDocumentsResult> RetrieveAsync(GetDocumentRegimeQuery query) { var documents = context.Documents .AsNoTracking() .Where(doc => doc.Regime.Id == query.RegimeId && doc.AfficherSiteParticipant == true) .Select(d => new DocumentDto { Id = d.Id, Nom = d.Nom, TypeDocument = d.TypeDocument, DateSauvegarde = d.DateSauvegarde, Extension = d.Extension }); if (query.TypesExclus.Any()) { documents = documents.Where(doc => !query.TypesExclus.Contains(doc.TypeDocument)); } return new GetDocumentsResult { Documents = await documents.ToListAsync() }; }
内容的提问来源于stack exchange,提问作者jboo
相关产品推荐
相关产品推荐

