entity-framework - 使用 Load/LoadAsync 时,如何确定将多少行加载到 EF6 DbContext 中?
问题描述
/方法分别返回DbContext
DbSet<T>.Load
和:它们执行查询,然后将加载/实例化的实体对象添加到's并更新导航属性和已加载对象的反向导航,但它们不返回有关加载内容的任何信息:似乎没有办法获取已加载行数的实际计数。DbSet<T>.LoadAsync
void
Task
DbContext
DbSet
令人惊讶的是,考虑到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
。
解决方案
你是对的,没有简单的方法来获取 Load 的加载条目数。它本质上与 ToList 相同,无需创建列表并将加载的元素添加到其中。如果您真的不想使用 ToList,一种选择是访问 DbContext.ChangeTracker 并从中获取条目数:
var entriesBefore = context.ChangeTracker.Entries().Count();
// load more entities
var loaded = context.ChangeTracker.Entries().Count() - entriesBefore;
请注意,当您在查询中包含其他相关实体时,这并不准确。
推荐阅读
- c# - 重新绘制到 SKCanvas 时如何修复“致命信号 11”
- python - Pytorch:了解 nn.Module 类如何在内部工作
- yaml - 即使拥有完整的管理权限,sns 中未发布的用户,lambda 也超出了 vpc
- c# - 无论如何要从另一个表或另一个模型中提取数据以下拉列表或选择框?
- flutter - 如何为按钮创建自定义倾斜边缘?
- java - 为什么我在下面的代码中将数字 320.04 打印到控制台?
- python - 如何使用python关闭pdf文件
- r - 如何将文本拆分为一列并使用 R 将每个拆分部分放入一个新的数据框中?
- python - 从源安装 Odoo:错误:找不到 pg_config 可执行文件
- ios - UIViewControllerRepresentable 在滚动视图中不接收焦点更新