代码之家  ›  专栏  ›  技术社区  ›  expenguin

在一个上下文调用上加载多个导航属性

  •  0
  • expenguin  · 技术社区  · 6 年前

    我正在编写一个C#应用程序,它利用EF Core生成我与数据库的所有关系。我目前只在需要时加载一些关系(在本例中是在删除记录时)。

    我正在尝试使用Context.Entry,以便仅在需要时加载所需的关系,请参见以下内容:

    await Context.Entry(entity).Collection(e => e.DBTable1).LoadAsync();
    await Context.Entry(entity).Collection(e => e.DBTable2).LoadAsync();
    

    await Context.Entry(entity).Collection(e => e.DBTable1 && e => e.DBTable2).LoadAsync();
    

    我知道我可以使用.Include/.thenclude在执行EF查询之前构建关系,但是,我的工作流要求在执行查询之后加载关系。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Moho    6 年前

    await dbContext.Set<TEntity>()
        .Where( e => e.Id == entity.Id )
        .Select( e => new
        {
            DoesntMatter01 = e.DBTable1,
            DoesntMatter02 = e.DBTable2,
        } )
        .SingleOrDefaultAsync();
    

    注意,只要查询是枚举的,实际上并不关心结果。在这种情况下,我们使用 SingleOrDefault 但是,如果我们选择实体集合的id,然后使用 ids.Contains( e.Id ) where ToArray 或将返回所有结果的类似方法。

    编辑:因为我觉得很有动力:

    public Task LoadEntityCollections( DbContext dbContext, IEnumerable<EntityType> entities )
    {
        dbContext.Set<EntityType>()
            .Where( e => entities.Select( ei => ei.Id ).Contains( e.Id ) )
            .Select( e => new
            {
                // assign from properties you want loaded
            } )
            .ToArrayAsync();
    }