我们有一个数据层。该数据层内部是代表各种表/列的模型。这些模型也与其各自的
DbContext
相关联(称之为 OurDbContext
)。
public class Foo
{
public string Field1 { get; set; }
public string Field2 { get; set; }
}
在一个特定的项目中,我想向
Foo
添加一个表中没有的字段。
public class Bar : Foo
{
public string Field3 { get; set; }
}
我想创建一个
IQueryable
来延迟执行。
IQueryable<Bar> queryable = OurDbContext.Foo.FromSqlRaw(someSQl)
.AsNoTracking()
.Select(x => new Bar()
{
Field1 = x.Field1
Field2 = x.Field2
Field3 = null // null for now, we'll fill it in later
});
当您查看 Intellisense 时,它会显示
.Select
返回 IQueryable
。
但我看到发生的是,当我们创建
IQueryable
时,它正在执行 SQL(哎呀,我错了,只是慢)。我们想要使用延迟执行的 IQueryable
,这样我们就可以通过 GUI 一次跳过/获取 100 条记录。
但是,IQueryable 的创建速度很慢 - 这很糟糕。
编辑:
我注意到,在调试时,执行上面的一行代码需要 10-15 秒,但如果我这样做(没有
.Select
),它是瞬时的(甚至不是一秒):
IQueryable<Foo> queryable = OurDbContext.Foo.FromSqlRaw(someSQl)
.AsNoTracking();
我在这里缺少什么?
但我看到发生的是,当我们创建 IQueryable 时,它正在执行 SQL
那你就看错了。例如,您可能会看到它在监视窗口中执行,或者在调试期间在 VS 的自动监视窗口中执行。无论您执行该查询,都会得出错误的结论。