C# .NET Core 6.0 - 创建 IQueryable 时使用 Select 很慢,为什么?

问题描述 投票:0回答:1

我们有一个数据层。该数据层内部是代表各种表/列的模型。这些模型也与其各自的

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();

我在这里缺少什么?

c# .net-core .net-6.0 iqueryable
1个回答
0
投票

但我看到发生的是,当我们创建 IQueryable 时,它正在执行 SQL

那你就看错了。例如,您可能会看到它在监视窗口中执行,或者在调试期间在 VS 的自动监视窗口中执行。无论您执行该查询,都会得出错误的结论。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.