Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.NET Core 3.1实体框架存在查询持续时间_C#_Sql Server_Asp.net Core_Entity Framework Core - Fatal编程技术网

C# ASP.NET Core 3.1实体框架存在查询持续时间

C# ASP.NET Core 3.1实体框架存在查询持续时间,c#,sql-server,asp.net-core,entity-framework-core,C#,Sql Server,Asp.net Core,Entity Framework Core,我试图在ASP.NET Core 3.1 MVC应用程序中评测数据库第一个EF SQL查询,这似乎有点耗费时间 在使用秒表并努力获得我想要的粒度后,因此我安装了MiniProfiler(顺便说一句,如果您没有它,请获取它) 简而言之,函数将接收一个以逗号分隔的零件id字符串,并返回一个工作单基本id的字符串[] string[] part_array = part.Split(','); string[] base_id_array = { }; using (MiniProfiler.Cur

我试图在ASP.NET Core 3.1 MVC应用程序中评测数据库第一个EF SQL查询,这似乎有点耗费时间

在使用秒表并努力获得我想要的粒度后,因此我安装了MiniProfiler(顺便说一句,如果您没有它,请获取它)

简而言之,函数将接收一个以逗号分隔的零件id字符串,并返回一个工作单基本id的字符串[]

string[] part_array = part.Split(',');
string[] base_id_array = { };

using (MiniProfiler.Current.Step("TestDB"))
{
    using (DB_Access.AccessContext db_context = new DB_Access.AccessContext())
    {
        var query = from a in db_context.WorkOrder.AsNoTracking()
                    where part_array.Contains(a.User2)
                    select new
                    {
                        a.BaseId
                    };

        if (query != null)
        {
            if (query.Any())
            {                       
                foreach (var item in query)
                {
                    Array.Resize(ref base_id_array, base_id_array.Length + 1);
                    base_id_array[base_id_array.GetUpperBound(0)] = item.BaseId;
                }
            }
        }
    }
}
MiniProfiler显示以下内容:

因此,第一个EF执行一个EXIST查询,需要147.7ms

然后EF关闭连接,重新打开,并执行实际的SELECT查询,这只需要40.4ms

我想问题有三个方面

  • 为什么EF执行EXIST查询
  • 为什么查询要花这么长时间
  • 为什么在同一using语句中关闭和重新打开连接
  • 为什么EF执行EXIST查询

    因为代码中有下一行:

    if (query.Any())
    
    这将导致您的第一个查询。首先具体化查询并使用结果:

    var queryResults = (from a in db_context.WorkOrder.AsNoTracking()
                    where part_array.Contains(a.User2)
                    select new
                    {
                        a.BaseId
                    })
                    .ToList();
    foreach (var item in queryResults)
    {
        Array.Resize(ref base_id_array, base_id_array.Length + 1);
        base_id_array[base_id_array.GetUpperBound(0)] = item.BaseId;
    }
    
    您不需要
    null
    检查(因为您正在为变量分配局部变量,
    ToList
    如果在数据库中找不到结果,则返回空值)和
    Any
    foreach
    将为您处理)

    为什么查询要花这么长时间


    MiniProfiler似乎没有说查询在数据库端需要多长时间,而是说需要多长时间
    ExecuteReader
    。我将假设这是一个只运行一次的测试代码,因此由于JIT编译,它可能需要很长时间(比select更长),而后续调用所需的时间更少,因为JIT编译已经为它执行过。但我建议使用数据库探查器检查查询。

    数据库有多大?返回了多少数据?尝试使用语句切换这两个选项。