如何根据子集合中的值 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)));
我有一份文件清单。一个文件是这样的:
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)));