首页 > 解决方案 > 使用 Load/LoadAsync 时,如何确定将多少行加载到 EF6 DbContext 中?

问题描述

/方法分别返回DbContext DbSet<T>.Load和:它们执行查询,然后将加载/实例化的实体对象添加到's并更新导航属性和已加载对象的反向导航,但它们不返回有关加载内容的任何信息:似乎没有办法获取已加载行数的实际计数。DbSet<T>.LoadAsyncvoidTaskDbContextDbSet

令人惊讶的是,考虑到SaveChanges/SaveChangesAsync方法确实返回了受其执行的任何 DML 语句影响的行数。

我知道有一种解决方法,我可以使用ToList/ToListAsync代替然后使用该List<T>.Count属性,但这违背了使用Load/的意义LoadAsync


例如,考虑这个两步查询操作:

async Task<PageViewModel> LoadOrdersAsync( Int32 customerId, Expression<Func<Order,Boolean>> predicate )
{
    // Step 1:
    List<Order> orders = await this.dbContext.Orders
        .Where( o => o.CustomerId == customerId )
        .Where( predicate )
        .ToListAsync()
        .ConfigureAwait(false);

    // Step 1.5:
    List<Int32> orderIds = orders.Select( o => o.OrderId ).ToList();

    // Step 2:
    await this.dbContext.OrderItems
        .Where( i => orderIds.Contains( i.OrderId ) )
        .LoadAsync()
        .ConfigureAwait(false);

    // Done!
    return new PageViewModel( orders );
}

我想获取在OrderItem第二步中加载的实体的数量,但据我所知,如果不使用ToList/是不可能的ToListAsync

标签: entity-frameworkentity-framework-6dbcontext

解决方案


你是对的,没有简单的方法来获取 Load 的加载条目数。它本质上与 ToList 相同,无需创建列表并将加载的元素添加到其中。如果您真的不想使用 ToList,一种选择是访问 DbContext.ChangeTracker 并从中获取条目数:

var entriesBefore = context.ChangeTracker.Entries().Count();
// load more entities
var loaded = context.ChangeTracker.Entries().Count() - entriesBefore;

请注意,当您在查询中包含其他相关实体时,这并不准确。


推荐阅读