2014-09-14 2 views
0

enter image description here엔터티 프레임 워크 성능이 좋지 않음

C# Windows Forms 응용 프로그램에서 EF 6.1.1을 사용하고 성능 요소에 이상한 문제가 발생했습니다.

내 데이터베이스에는 Ticket이라는 테이블이 있고 49300 개의 레코드가 있습니다. 이 테이블에는 여러 개의 다른 테이블이 링크되어 있습니다.

 
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 데이터 컨텍스트가 클래스의 정적 변수로 전 세계적으로 볼 수 있습니다 : http://i.imgur.com/u4gKVFI.png

레코드 계산은 다음과 같습니다 : 엔티티 프레임 워크 다이어그램에서 확인할 수있다. 다음 코드를 실행하면 데이터를로드하는 데 12-15 초 (.ToList() 방법에 대해서만) 걸립니다. 및 DataGridView로 바인딩하십시오. 성능을 향상시킬 수있는 방법이 있습니까? 당신이 정말로있는 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; 
    } 

답변

0

, 당신은 Virtual Mode를 사용해야합니다. MSDN Implementing Virtual Mode with Just-In-Time Data Loading in the Windows Forms DataGridView Control에서

인용구 : DataGridView 컨트롤에서 가상 모드를 구현하는

이유 중 하나는 필요한 경우에만로 데이터를 검색하는 것입니다. 이를 just-in-time 데이터로드이라고합니다.

+0

최대 시간은 .ToList() 메소드에서 취해진 다. –

+0

@SanketShah, 데이터는 필요에 따라 검색되기 때문에 문제가되지 않는 가상 모드가 있습니다. 모든 레코드는 즉시 검색되지 않습니다. – Joakim

+0

EF 6와 관련하여 샘플이 있습니까? 'DbContext' 방식을 사용하고 있습니다. –