如何根据子集合中的值 select 对象?

How to select objects based on values in sub collection?

我有一份文件清单。一个文件是这样的:

class Document
{
    string Name;
    string Description;
    List<Page> Pages;
}

一个页面是这样的:

class Page
{
    string OCR;
}

以下针对 ef core 5 的 Fluent LINQ 查询是什么?: 我想获取名称、描述或 OCR 中包含“文本”的所有文档。

是否可以通过单个流畅的 LINQ 查询获取文档? 我想到了这个,但我不知道如何添加 OCR 位:

Documents.Where (   
                    x =>    x.Name.ToUpper ().Contains (text) 
                    ||      x.Description.ToUpper ().Contains (text)
                ).ToList ();

我知道我可以在文档上添加一个 属性,例如 OCR,检索所有文档,然后在内存中 return 来自页面的所有 OCR 文本,然后在查询中执行类似

Documents.Where (   
                    x =>    x.Name.ToUpper ().Contains (text) 
                    ||      x.Description.ToUpper ().Contains (text)
                    ||      x.OCR.ToUpper ().Contains (text)
                ).ToList ();

并且可能还有其他解决方案,但我想知道是否可以单独在 LINQ 中针对数据库执行此操作。

提前致谢!

您可以简单地包含页面作为条件,它应该在 EF 的查询翻译中正确翻译。

这是一个示例,包含示例数据:

var Documents = new List<Document>()
    {
        new Document
        {
            Name = "nottext",
            Description = "nottext",
            Pages = new List<Page>
            {
                new Page
                {
                    OCR = "text"
                }
            }
        },
        new Document
        {
            Name = "nottext",
            Description = "nottext",
            Pages = new List<Page>
            {
                new Page
                {
                    OCR = "text"
                }
            }
        }
    };

Documents.Where(d =>
       d.Name.Contains("text", StringComparison.OrdinalIgnoreCase)
    || d.Description.Contains("text", StringComparison.OrdinalIgnoreCase)
    || d.Pages.Any(p => p.OCR.Contains("text", StringComparison.OrdinalIgnoreCase)));