[英]Entity Framework Poor Performance
我在C#Windows Forms Application中使用EF 6.1.1,並且在性能因素上遇到奇怪的問題。
我的數據庫有一個名為Ticket
的表,並有49300條記錄。 該表具有多個其他鏈接的表。 實體框架圖可從以下網站獲得: http : //i.imgur.com/u4gKVFI.png
記錄數如下:
BillableOption 4 Company 390 Contact 687 Location 3 Member 16 ServiceBoard 6 ServiceItem 0 ServicePriority 8 ServiceSource 5 ServiceStatus 93 ServiceSubType 668 ServiceType 20 Ticket 49300 TimeEntry 52518 TimeEntryMember 0 WorkRole 10 WorkType 5
我的EF數據上下文可作為類的靜態變量全局使用。 當我執行以下代碼時, 加載數據需要12到15秒的時間(僅談論.ToList()
方法)。 並與DataGridView綁定。 有什么辦法可以提高性能?
public static List LoadTicket() { bool lastValue1 = DataAccessLocal.dc.Configuration.AutoDetectChangesEnabled; bool lastValue2 = DataAccessLocal.dc.Configuration.ProxyCreationEnabled; DataAccessLocal.dc.Configuration.AutoDetectChangesEnabled = false; DataAccessLocal.dc.Configuration.ProxyCreationEnabled = false; var returnValue = (from r in DataAccessLocal.dc.Tickets.AsNoTracking() select new LinqTicket { Summary = r.Summary, DetailDescription = r.Summary, Resolution = r.Resolution, CompanyName = r.Company.CompanyName, ContactName = (r.Contact == null ? string.Empty : r.Contact.FirstName + " " + r.Contact.LastName), BoardName = r.ServiceBoard.ServiceBoardName, Priority = r.ServicePriority.ServicePriorityName, Source = r.ServiceSource.ServiceSourceName, Location = r.Location.LocationName, ServiceType = r.ServiceTypeRecId == null ? string.Empty : r.ServiceType.ServiceTypeName, ServiceSubType = r.ServiceSubTypeRecId == null ? string.Empty : r.ServiceSubType.ServiceSubTypeName, ServiceItem = r.ServiceItemRecId == null ? string.Empty : r.ServiceItem.ServiceItemText, StatusName = r.ServiceStatus.ServiceStatusName, TicketRecId = r.TicketRecId, RemoteTicketId = r.RemoteTicketRecId.Value, DueDate = r.RequiredDate == null ? new DateTime(1900, 1, 1) : r.RequiredDate.Value, EstimatedHours = r.BudgetHours == null ? 0 : r.BudgetHours.Value, ServiceBoardId = r.ServiceBoard.ServiceBoardRecId, InternalStatus = r.InternalStatus.HasValue == true ? (enmInternalStatus)r.InternalStatus.Value : enmInternalStatus.OK, LastUpdatedByMemberRecId = r.LastUpdatedByMemberRecId }).ToList(); DataAccessLocal.dc.Configuration.AutoDetectChangesEnabled = lastValue1; DataAccessLocal.dc.Configuration.ProxyCreationEnabled = lastValue2; return returnValue; }
如果確實需要將那么多記錄綁定到DataGridView,則應該使用Virtual Mode 。
引用msdn 在Windows窗體DataGridView控件中通過實時數據加載實現虛擬模式 :
在DataGridView控件中實現虛擬模式的原因之一是僅在需要時才檢索數據。 這稱為即時數據加載 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.