Dot-Net
EF 4.3.1 和 EF 5.0 DbSet.Local 比實際的數據庫查詢慢
我有一個包含大約 16,500 個城市的表的數據庫,以及該數據庫的 EF 數據模型(數據庫優先)。我使用程式碼將它們預載入到記憶體中:
Db.Cities.Load()…然後在使用它們時,我嘗試了以下每個查詢:
Dim cities() As String = Db.Cities.Select(Function(c) c.CityName).ToArray Dim cities() As String = Db.Cities.Local.Select(Function(c) c.CityName).ToArray第一個查詢很快(約 10 毫秒),但第二個查詢第一次執行大約需要 2.3 秒(儘管在此之後呼叫它比第一個查詢快)。
這沒有任何意義,因為 SQL Server Profiler 會驗證第一個查詢是否正在訪問另一台電腦上的數據庫,但第二個不是!
我試過關閉
Db.Configuration.AutoDetectChangesEnabled,我試過預先生成視圖。我該怎麼做才能
.Local更快?(並非所有執行此應用程序的客戶端都將在快速 LAN 上。)
為什麼不簡單地從第一個查詢中保存字元串列表並使用它。
List<string> cities = db.Cities.Select( x=>x.CityName).ToList();由於 Select 可能會執行一些一致性檢查,因此本地可能會更慢。
我使用Resharper的便捷功能走過了該
Local物業的源頭。如果您正在執行的只是以上三行,您將首先看到一個可能不是您的問題的呼叫。但是隨後 EF 為它創建了一個新的 ObservableCollection並逐項填充它。在第一次通話時,其中任何一個都可能代價高昂。DetectChanges``Local直接針對 EF 的查詢
DbSet將路由到我確定直接訪問內部本地記憶體的 EF 數據庫提供程序。