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作为数据库引擎。