【发布时间】:2021-12-30 14:15:27
【问题描述】:
我正在使用 Entity Framework Core 使用以下代码从数据库中查询数据:
CamicDbContext context = new CamicDbContext();
public override object Read(DataManagerRequest dm, string key = null)
{
IQueryable<Country> query = context.Set<Country>();
query = query.Where(x => x.IsDeleted == false);
query = query.Where(x => x.Code == "PT");
int count = query.Cast<Country>().Count();
return dm.RequiresCounts ? new DataResult() { Result = query, Count = count } : (object)query;
}
当声明query 变量时,它似乎获取了表中的所有项目(图1),这似乎是错误的,因为它对于较大的实体效率低下;因此,我想在不获取数据的情况下初始化变量,构建查询,然后仅在到达return query 时执行查询,这样服务器只会查询并返回与过滤器匹配的项目。
我尝试了多种解决方案。这个 - Creating dynamic queries with Entity Framework - 接近我想要实现的目标,但其中的代码与我上面提到的代码具有相同的效果。我错过了使用延迟执行的东西吗?
我执行了
IQueryable<Country> query = context.Set<Country>();
结果视图显示表中的所有 264 个条目:
【问题讨论】:
-
我相信在调试模式下查看结果视图会加载
IQueryables。如果我没记错的话,在运行时它不应该查询,直到你得到计数。 -
当你已经有一个
IQueryable<Country>实例时,为什么还要调用Cast<Country>()? -
声明变量
query不会获取表的全部内容。仅在执行/迭代查询时才检索行。所以你的代码应该已经做了你打算做的事情。如果没有,请添加 minimal reproducible example 以显示您遇到的问题。 -
“结果视图显示...” - 注意到消息“扩展结果视图将枚举 IEnumerable”?枚举意味着执行。
-
@Progman 感谢您的提醒。事实上
cast是不必要的。谢谢你的回答,我错过了@IvanStoev 的那些小信息。
标签: c# asp.net-core entity-framework-core