c# - 什么时候在 DbContext 上执行查询

标签 c# asp.net entity-framework entity-framework-6 asp.net-mvc-5

我试图了解在使用 EF6 框架时拥有一个 DbContext 类与拥有多个类对性能的影响。

例如,如果我们有一个像这样的简单 DbContext:

public class MainDbContext : DbContext
{
    public DbSet<Car> Cars { get; set; }

    public void AddCar(Car car)
    {
        Cars.Add(car);
        SaveChanges();
    }
}

现在假设我有一个服务,它以下列方式使用上述 DbContext:

public class CarService
{
    public List<Car> Cars { get; private set; }
    public CarService()
    {
        var dbContext = new MainDbContext();
        Cars = dbContext.Cars.ToList();
    }
}

DbContext 在什么时间点访问数据库并检索存储在数据库中的所有汽车?是在我调用 var dbContext = new MainDbContext(); 时还是在我调用 Cars = dbContext.Cars.ToList(); 时?

如果是前者,如果我有一个包含 100 个表的 DbContext,是否会在创建 DbContext 时查询所有 100 个表?

最佳答案

没有。一旦您枚举了一个表,查询就会发生。即使在您的第二个示例中,它仍然没有连接到数据库。

枚举时会连接,例如:

dbContext.Cars.ToList();

或者

foreach (Car c in dbContext.Cars)

或者将表格绑定(bind)到 UI 控件。

但是,当您创建位置、排序依据、然后依据、加入等时。例如

var result = dbContext.Cars.Where(c => c.Id == 35).OrderBy(c => c.Name);

不会连接到数据库。您只是准备将逻辑操作序列转换为 SQL 查询。


问题更新后

现在,您的第二个示例使用 ToList() 枚举结果并连接到数据库以获取数据。

关于c# - 什么时候在 DbContext 上执行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44272140/

相关文章:

javascript - Supersized.js 背景未在母版页中呈现

c# - 如何使控制台应用程序在关闭时优雅地退出

c# - 多个更新语句抛出 "cannot open"

asp.net - 如何在 TFS 构建中从构建输出目录复制到我的服务器?

ASP.NET/DataList 的 DataItem 回发后为空

c# - Entity SQL or StoredProcedure,用什么?

c# - 在 WCF 服务 C# 中使用静态上下文、ConcurrencyMode.Single、InstanceContextMode.PerSession 有负面影响吗?

c# - 打破 POCO 关系

c# - 通过属性名称以及 JsonProperty 将 JSON 反序列化为对象

c# - C#加载二进制文件