2

我正在尝试使用新功能 Filtered on Include 但我没有以某种方式正确。 https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-5.0/whatsnew#preview-3

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

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

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

在此处输入图像描述

4

1 回答 1

3

但不知何故,数据库中的所有6 个产品都返回了

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

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

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

这可以与过滤后Include的 s 结合,但不是必须的。如果您不过滤,Includes您将获得按类别名称过滤的产品,但包含其集合中的所有类别。

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

于 2020-09-25T14:44:09.263 回答