C# 由于跳过符号,实体框架第一次查询速度较慢

C# 由于跳过符号,实体框架第一次查询速度较慢,c#,entity-framework,C#,Entity Framework,我知道第一个EF查询速度慢的问题已经讨论过了,但是没有一个答案是合适的 当我第一次运行EF查询时,执行它需要3到5秒。当我再次运行它时,只需要毫秒 测试代码: Stopwatch sw = new Stopwatch(); Console.WriteLine("--- CONNECTION ---"); sw.Restart(); Context = new Connection(); sw.Stop(); Console.WriteLine("Elapsed time in seconds:

我知道第一个EF查询速度慢的问题已经讨论过了,但是没有一个答案是合适的

当我第一次运行EF查询时,执行它需要3到5秒。当我再次运行它时,只需要毫秒

测试代码:

Stopwatch sw = new Stopwatch();

Console.WriteLine("--- CONNECTION ---");
sw.Restart();
Context = new Connection();
sw.Stop();
Console.WriteLine("Elapsed time in seconds: " + sw.Elapsed.ToString(@"s\.ffff"));

Console.WriteLine("--- FIRST QUERY ---");
sw.Restart();
Context.Set<T>().Count();
sw.Stop();
Console.WriteLine("Elapsed time in seconds: " + sw.Elapsed.ToString(@"s\.ffff"));

Console.WriteLine("--- SECOND QUERY ---");
sw.Restart();
Context.Set<T>().Count();
sw.Stop();
Console.WriteLine("Elapsed time in seconds: " + sw.Elapsed.ToString(@"s\.ffff"));
是的,这是法语,对不起。基本上,这是“跳过加载符号”消息

程序集列表的变化取决于我使用的查询:
Context.Set()
不会加载任何内容,而且速度非常快
Context.Set().Count()
Context.Set().ToList()
都非常慢

我不确定这些消息的真正含义(如果跳过加载,为什么还要花时间?),但如果我必须加载一些程序集,我宁愿在启动时加载

可能吗?还是有办法加快速度

谢谢。

Context.Set()
不会加载任何内容,因为这是一个查询定义,而不是查询执行。
Count()
ToList()
方法都强制执行查询(即,查询将转换为在数据库上执行的SQL)

第一个查询的执行速度总是较慢,因为EF需要加载元数据(它使用xml或代码映射)


建议阅读:

您可能正在寻找以下内容:是否有一种方法可以让EF在启动时加载元数据?@Raya:您可以在启动例程的某个地方调用代码:
使用(var ctx=new MyContext()){ctx.Database.Initialize(false);}
只加载元数据(如果有DB初始值设定项,则运行DB初始值设定项)@Slauna:我尝试了你的解决方案,但它似乎没有加载任何内容,元数据在第一次查询时仍然加载。@Raya在我看到
Slauma
的评论之前,我已经得出了相同的结论。我将完全相同的代码添加到我的应用程序引导程序中,并开始使用启动屏幕。它确实(至少对我来说)为EF加载了所有必要的膨胀,然后我在应用程序中的第一个查询是闪电般的快。
--- CONNECTION ---
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'D:\Developpement\CSharp_Prism\Test_Prism_2\Prism\src\Shell\bin\Debug\System.Data.SQLite.EF6.dll' chargé
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'D:\Developpement\CSharp_Prism\Test_Prism_2\Prism\src\Shell\bin\Debug\System.Data.SQLite.dll' chargé
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'D:\Developpement\CSharp_Prism\Test_Prism_2\Prism\src\Shell\bin\Debug\EntityFramework.SqlServer.dll' chargé
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Transactions\v4.0_4.0.0.0__b77a5c561934e089\System.Transactions.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
Elapsed time in seconds: 0.2727

--- FIRST QUERY ---
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.Data.OracleClient\v4.0_4.0.0.0__b77a5c561934e089\System.Data.OracleClient.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
Native library pre-loader is trying to load native SQLite library "D:\Developpement\CSharp_Prism\Test_Prism_2\Prism\src\Shell\bin\Debug\x64\SQLite.Interop.dll"...
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.Entity\v4.0_4.0.0.0__b77a5c561934e089\System.Data.Entity.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.resources\v4.0_4.0.0.0_fr_b77a5c561934e089\System.Xml.resources.dll' chargé
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'C:\Windows\Microsoft.Net\assembly\GAC_64\System.EnterpriseServices\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.EnterpriseServices.Wrapper.dll' chargé, chargement des symboles ignoré. Le module est optimisé et l'option du débogueur 'Uniquement mon code' est activée.
'Shell.vshost.exe' (Managé (v4.0.30319)) : 'D:\Developpement\CSharp_Prism\Test_Prism_2\Prism\src\Shell\bin\Debug\fr\EntityFramework.resources.dll' chargé
Elapsed time in seconds: 3.3032

--- SECOND QUERY ---
Elapsed time in seconds: 0.0035