2013-07-24 2 views
1

랙 모델과 서버 모델이 있습니다. 나는 다음을 수행 단일 서버를 검색하려면 현재 때, 명시 적 로딩을 지정합니다 : - :람다 식 내부에 포함 방법을 지정하는 방법

-

public Server FindAllServer(int id) 
     { 

      return project.Servers.Where(c => c.ServerID == id) 
       .Include(a => a.OperatingSystem) 
       .Include(a2 => a2.DataCenter) 
       .Include(a3=>a3.Rack) 
       .Include(a4=>a4.ServerModel) 
       .Include(a5=>a5.Technology) 
       .Include(a6=>a6.VirtualMachines) 
       .Include(a7=>a7.TechnologyStatu) 
       .Include(a8=>a8.TechnologyBackUpStatu) 
       .Include(a9=>a9.TechnologyRole) 
       .SingleOrDefault(); 
     } 

하지만 지금은 랙 및 모든 서버/S를 표시하려면, 나는 다음과 같은했다

public Rack FindAllRack(int id) 
     { 

      return project.Racks.Where(c => c.RackID == id) 
       .Include(a => a.Servers) 
       .Include(a2 => a2.DataCenter) 
       .Include(a3 => a3.Firewalls) 
       .Include(a4 => a4.Routers) 
       .Include(a5 => a5.Technology) 
       .Include(a6 => a6.StorageDevices) 
       .Include(a7=>a7.Switches) 
       .Include(a8=>a8.Zone) 
       .SingleOrDefault(); 
     } 

그래서 같은 뭔가를 쓸 수있는 나는, 명시 적으로 랙에서 서버/S에 대한 모든 탐색 속성을 포함하도록 정의 할 수있는 방법을 확실하지 않다 : -

project.Racks.Where(c => c.RackID == id).Include(a => a.Servers.Include(………)) 

문제가있는 것입니다 I h 경우 랙 아래에 50 대의 서버를 설치 한 다음 각 서버마다 서버 탐색 속성을 검색하는 데 약 7 건의 요청이있을 것이므로 약 350 건의 요청이 있습니다 !!!

+0

상위 개체에 대한 자식 컬렉션이있는 경우 프로덕션 수준 볼륨으로 데이터베이스가로드 될 때 SQL을 프로파일 링해야 할 수 있습니다. 이런 종류의 쿼리가 dev에서 잘 작동하고 그리드에서 생산이 중단되는 것을 보았습니다. 정말로 모든 어린이 기록이 정말로 필요하십니까? –

+0

예 모든 아이 기록이 필요합니다. –

+0

이러한 모든 하위 레코드를 포함하고 있습니다. 기본 랙 페이지에서이 랙과 연결된 서버, 스위치 등의 수를 표시합니다. 따라서 이러한 탐색 속성을 포함하지 않으면 각 탐색 속성의 개수를 가져 오는 별도의 요청이 전송되므로 문제가 발생할 수 있습니다. –

답변

0

시도해 보셨습니까?

return project.Servers 
       .Include(a => a.OperatingSystem) 
       .Include(a2 => a2.DataCenter) 
       .Include(a3=>a3.Rack) 
       .Include(a4=>a4.ServerModel) 
       .Include(a5=>a5.Technology) 
       .Include(a6=>a6.VirtualMachines) 
       .Include(a7=>a7.TechnologyStatu) 
       .Include(a8=>a8.TechnologyBackUpStatu) 
       .Include(a9=>a9.TechnologyRole) 
       .Where(srv => srv.Rack.RackID == id); 
1

나는 당신이, 예를 들어, 속성 경로를 지정하여 Include()의 문자열 기반 과부하로이 작업을 수행 할 수 있어야한다고 생각합니다

project.Racks.Where(c => c.RackID == id).Include("Servers.SomePropertyOfServer") 

편집 : 일부 더 많은 연구를 수행 한 후,이 또한 작동하지 않을 수 있습니다 나타납니다

project.Racks.Where(c => c.RackID == id).Include(a => a.Servers.Select(s => s.SomePropertyOfServer))

특별히 단원은 예를 들어 "열심히 다중 레벨로드", this link를 참조하십시오.

+0

이렇게하면 랙의 포함 목록 안에 서버의 전체 포함 목록을 다시 작성해야합니다. –

+0

그렇게 보입니다. 원하는 속성을 익명 형식으로 투영 할 수도 있습니다. – luksan

1

필요한 경우 다양한 자식 개체의 개수가 필요하므로 다음을 고려하십시오. 데이터베이스에 최대 2 행만 가져 오는 단일 요청을 발행해야합니다. 테스트를 거치지 않았으므로 요청을 프로파일 링하십시오. 하나 개 이상의 레코드를 가져 경우 예외를 throwning 계획하지 않는 경우

 return project.Racks.Where(c => c.RackID == id) 
      .Select(a => new { 
       serverCount = a.Servers.Count(), 
       dataCenterCount = a.DataCenter.Count(), 
       firewallCount = a.Firewalls.Count(), 
       routerCount = a.Routers.Count(), 
       technologyCount = a.Technology.Count(), 
       storageDeviceCount = a.StorageDevices.Count(), 
       switchCount = a.Switches.Count(), 
       zoneCount = a.Zone.Count() 
      }).SingleOrDefault(); 

또한, FirstOrDefault 대신 SingleOrDefault를 사용합니다.