Entity framework core 如何循环实体框架核心中的dbcontext所有数据库集以获得计数?

Entity framework core 如何循环实体框架核心中的dbcontext所有数据库集以获得计数?,entity-framework-core,Entity Framework Core,在我的上下文中有20个dbset,我希望获得每个dbset的行数,以确保所有dbset行数都为0。要获取一个dbset的计数,以下是我的代码: var person = context.Persons.Count(); 有没有办法在上下文中循环,动态获取每个dbset的计数?有解决方案。用法很简单: var tablesinfo=ctx.GetTablesInfo(); if(tableInfo!=null) { var withRecords=tablesinfo .IgnoreQueryF

在我的上下文中有20个dbset,我希望获得每个dbset的行数,以确保所有dbset行数都为0。要获取一个dbset的计数,以下是我的代码:

var person = context.Persons.Count();

有没有办法在上下文中循环,动态获取每个dbset的计数?

有解决方案。用法很简单:

var tablesinfo=ctx.GetTablesInfo();
if(tableInfo!=null)
{
var withRecords=tablesinfo
.IgnoreQueryFilters()
.Where(ti=>ti.RecordCount>0)
.ToArray();
}
扩展返回
IQueryable
,您可以稍后重用此查询。可能您需要过滤掉视图,但我认为您可以处理

和执行:

公共静态类QueryableExtensions
{
公共类表信息
{
公共字符串TableName{get;set;}=null!;
公共int记录计数{get;set;}
}
公共静态IQueryable GetTablesInfo(此DbContext ctx)
{
表达式查询=null;
IQueryProvider=null;
var ctxConst=表达式常数(ctx);
var groupingKey=表达式常数(1);
var newExpression=Expression.New(typeof(TableInfo).GetConstructor(Type.EmptyTypes));
var tableNameProperty=typeof(TableInfo.GetProperty)(nameof(TableInfo.TableName));
var recordCountProperty=typeof(TableInfo.GetProperty)(nameof(TableInfo.RecordCount));
foreach(ctx.Model.GetEntityTypes()中的var entityType)
{
var entityParam=Expression.Parameter(entityType.ClrType,“e”);
var tableName=entityType.GetTableName();
var setQuery=Expression.Call(ctxConst,nameof(DbContext.Set),new[]{entityType.ClrType});
provider???=((IQueryable)Expression.Lambda(setQuery.Compile().DynamicInvoke()).provider;
var groupingParameter=Expression.Parameter(typeof(IGrouping).MakeGenericType(typeof(int),entityParam.Type),“g”);
变量选择器=Expression.MemberInit(newExpression,
Expression.Bind(tableNameProperty,Expression.Constant(tableName)),
Expression.Bind(recordCountProperty,
调用(typeof(Enumerable)、nameof(Enumerable.Count)、new[]{entityParam.Type}、groupingParameter));
var groupByCall=Expression.Call(typeof(Queryable)、nameof(Queryable.GroupBy)、new[]
{
entityParam.Type,
类型(int)
},
setQuery,
表达式.Lambda(groupingKey,entityParam)
);
groupByCall=Expression.Call(typeof(Queryable)、nameof(Queryable.Select),
新[]{groupingParameter.Type,typeof(TableInfo)},
groupByCall,
Lambda(选择器,groupingParameter));
if(查询!=null)
query=Expression.Call(typeof(Queryable),nameof(Queryable.Concat),new[]{typeof(TableInfo)},query,
groupByCall);
其他的
query=groupByCall;
}
if(查询==null)
返回null;
返回provider.CreateQuery(查询);
}
}

简单。但我认为仅仅计数是不够的。您计划如何使用此信息?在继续执行某些数据导入过程之前,请确认所有表计数均为0@SvyatoslavDanylivI正在使用依赖项注入,并在构造函数中为上下文创建了我的上下文。所以当我传入_context时,它说
无法从'xxx.Interfaces.IAbcContext'转换为'Microsoft.EntityFrameworkCore.DbContext'
,所以你给自己制造了困难。找到在建议的函数中传递
DbContext
的方法。我对你们的接口和存储库一无所知。当然,函数可以被重写为读取属性。但这不是原始问题。好的,谢谢你的帮助