【问题标题】:Select only specific columns from included table in Entity Framework Core仅从 Entity Framework Core 中包含的表中选择特定列
【发布时间】:2022-01-30 01:06:52
【问题描述】:

如果我有这个

var selectedEntities = db.MyEntities.Include(item => item.RelatedEntities);

它将加载 MyEntities 中的所有属性(列)以及 ReleatedEntities 中的所有属性。如果我只需要 RelatedEntities 中的一个属性,我该如何指定?

【问题讨论】:

  • Include 是全部或全部。如果您需要一个属性,请使用 DTO 和投影 (Select)。
  • 也许像var selectedEntities = db.MyEntities.Include(item => item.RelatedEntities.Select(x => x.Property)); 这样的东西可能有用。
  • 你有什么解决办法吗?我想做同样的事情。只想加载带有角色名称的员工数据,但包括加载带有员工对象的整个角色对象
  • @Priya 我在单独的查询中加载相关实体。我的相关表包含一个包含文件的二进制字段,所以这要快得多。

标签: entity-framework entity-framework-core


【解决方案1】:

使用 .Select() 和匿名类型来限制你想要的列

var result = await _appDbContext.Companies
            .AsNoTracking()
            .Select(company => new
            {
                Company = company,
                EmployeeIds = company.Employees.Select(emp => emp.Id)
            })
            .ToListAsync()
            .ConfigureAwait(false);

【讨论】:

  • 这应该是公认的答案,因为它还生成了一个非常有效的查询。
【解决方案2】:

我一直在寻找相同的东西,在参考了其他问题之后,似乎不可能。我得到的理解是 EF 实体由其属性的集合表示,因此加载单个值不会完全定义实体。

要仅加载选定的属性,我们需要使用 Select 查询,而不是加载相关数据。查询将产生匿名类型。

注意:如果结果类型包含任何实体,则将跟踪更改。参考Tracking and projections

参考资料:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-19
    • 2021-10-20
    • 2012-03-10
    • 2016-08-04
    • 2018-01-22
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多