ef core 5.0 如何过滤包含

ef core 5.0 How to Filtered Include

我正在尝试使用 Filtered on Include 的新函数,但不知何故无法正确使用。 https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#preview-3

我得到了一个有分类的产品。我需要过滤类别 title/name 上的产品。这是多对多的关系。

类别标题应包含“Vlees”。但是不知何故 ALL 数据库中的 6 个产品被返回,即使 Category.Title 名称错误。

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

But somehow ALL 6 products in the database get returned

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

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

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

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

如此过滤 Include 让您可以自由地分别过滤查询结果和子集合。