C# 如何基于子集合中的值选择对象?

C# 如何基于子集合中的值选择对象?,c#,linq,ef-core-5.0,C#,Linq,Ef Core 5.0,我有一份文件清单。文档是这样的: class Document { string Name; string Description; List<Page> Pages; } class Page { string OCR; } 在fluent LINQ中,针对ef core 5的以下查询是什么 我想得到所有的文件,其中的文字是在名称,或描述或OCR 是否可以通过一个fluent LINQ查询获取文档? 我想到了这个,但我不知道如何添加OCR位: D

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

class Document
{
    string Name;
    string Description;
    List<Page> Pages;
}
class Page
{
    string OCR;
}
在fluent LINQ中,针对ef core 5的以下查询是什么 我想得到所有的文件,其中的文字是在名称,或描述或OCR

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

Documents.Where (   
                    x =>    x.Name.ToUpper ().Contains (text) 
                    ||      x.Description.ToUpper ().Contains (text)
                ).ToList ();
我知道我可以在文档上添加一个属性,比如OCR,检索所有文档,然后在内存中返回页面中的所有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)));

您可以简单地将页面作为一个条件包含在内,这应该在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)));

我没有做太多的EF,所以我不知道这是否正确地转换为SQL,但您是否需要像x.Pages.Anyp=>p.OCR.ToUpper.Containstext这样的东西?我也不知道.ToUpper是否是最好的方法,这取决于它的转换方式。我没有做太多的EF,所以我不知道这是否正确地转换为SQL,但是您是否需要像x.Pages.Anyp=>p.OCR.ToUpper.Containstext这样的东西?我也不知道.ToUpper是否是最好的方法,这取决于它的翻译方式。谢谢,它就像一个符咒。唯一的问题是我不能使用StringComparison.OrdinalIgnoreCase,因为它会抛出一个错误,表示表达式无法翻译。但这不是问题,因为我可以用ToUpper。我正在使用SQLite作为数据库引擎。谢谢你,它工作起来很有魅力。唯一的问题是我不能使用StringComparison.OrdinalIgnoreCase,因为它会抛出一个错误,表示表达式无法翻译。但这不是问题,因为我可以用ToUpper。我使用SQLite作为数据库引擎。