ef core 5.0如何过滤包括

问题描述

我正在尝试使用“包含时过滤”的新功能,但由于某种原因我没有正确使用它。 https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#preview-3

我有一个带有类别的产品。我需要按类别标题/名称过滤产品。这是多对多的关系。

类别标题应包含“ Vlees”。但是,即使使用了错误的Category.Title名称,也会以某种方式退回数据库中的 ALL 6个产品。

var products = await _context.Product
   .Include(c => c.ProductCategories.Where(c => c.Category.Title.Contains(containsTitle)))
   .ThenInclude(c => c.Category)
   .ToListAsync();

enter image description here

解决方法

但是以某种方式所有数据库中的6种产品被退回了

那是因为您正在查询_context.Product。过滤后的Include用于过滤子集合,而不是主查询。因此,您可以获得所有产品,但所有这些产品应仅包含通过过滤器的类别。

您似乎希望EF仅返回名称中包含“ Vlees”的类别的产品,但这并不是过滤Include的目的。为此,您必须自己过滤产品:

_context.Product
    .Where(p => p.ProductCategories.Any(c => c.Category.Title.Contains(containsTitle)))

这可以与过滤后的Include结合使用,但不一定要结合使用。如果您不过滤Includes,则会获得按类别名称过滤的产品,但会在其集合中包含所有类别。

经过过滤的Include使您可以自由地分别过滤查询结果和子集合。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...