首页 > 解决方案 > EF Core - 检查孩子的存在

问题描述

带有 SQL Server 后端的 EF Core。父实体包含一组子实体。在特定情况下,我对整个子集合不感兴趣,只对是否存在任何子的信息感兴趣——我想避免从数据库中检索整个集合。在 T-SQL 中,我可以使用带有计数的子查询或带有 TOP(1) 的 CROSS APPLY,但是如何在 EF 中实现这一点?

假设模型看起来像这样(为简洁起见,代码不完整):

class Invoice
{
  DateTime InvoiceDate { get; set; }
  Customer Customer { get; set; }
  int CustomerId { get; set; }
  ...
  ...
  ICollection<InvoicePosition> Positions { get; set; }
}

internal virtual DbSet<Invoice> InvoiceSet { get; set; }

我这样读取数据:

var invoices = context.InvoiceSet
  .Include(i => i.Customer).ThanInclude(c => c.Country)
  .Where(i => ...)
  .OrderBy(i => ...)
  .Skip(...).Take(...)
  .AsAsyncEnumerable();

await foreach (var invoice in invoices)
{ ... }

我可以包含职位并检查是否存在,但是如何在数据库端执行此操作?

编辑:我需要 InvoiceSet 中的其他属性 - bool HasPositions:

class Invoice
{
  DateTime InvoiceDate { get; set; }
  Customer Customer { get; set; }
  int CustomerId { get; set; }
  ...
  bool HasPositions { get; set; }
  ...
  ICollection<InvoicePosition> Positions { get; set; }
}

如何获取这个新属性的数据?如果可以使用 Linq Query 完成,请提供一个示例,如何将我的阅读方法转换为查询。

标签: c#ef-core-3.1

解决方案


.Where(i => i.Positions.Any())

推荐阅读