2016-06-15 6 views
2

으로 얻을 레코드를 업데이트 나는 그것이 CountryId 및 COUNTRYNAME 주어진 cityID에 따라 도착이 쿼리쿼리 너무 느린 - LINQ 쿼리

foreach (var item in collection) 
{ 
    var countrylist = from country in countryList 
           where 
            (from state in stateList 
             where 
              (from city in cityList 
              where 
              city.CityID == item.CityID 
              select new 
              { 
               city.CountryID 
              }).Contains(new { StateID = state.StateID }) 
             select new 
             { 
              state.CountryID 
             }).Contains(new { CountryID = country.CountryID }) 
           select new 
           { 
            CountryID = country.CountryIDD, 
            Name = country.Name 
           }; 

       item.Country = new Country(); 
       item.Country.CountryID = countrylist.Select(s => s.CountryID).FirstOrDefault(); 
       item.Country.Name = countrylist.Select(s => s.CountryName).FirstOrDefault(); 
} 

을 가지고 있고 그것은 컬렉션의 관련 개체를 업데이트합니다. 이제 루프에서 실행, 현재 나는 컬렉션에 5-10 개의 항목 (테스트 데이터)이 있으며 눈에 띄게 느린 시간이 걸립니다. 5-10 개 항목이 느린 경우 100 개 이상 항목에 너무 느립니다. 이 일을 더 잘 할 수있는 또 다른 방법이 있습니까?

은 내가 당신의 도시가있는 CountryID 필드가, 당신은 모든 국가에 가입 할 필요가 없습니다 추측거야 도움말

모든 종류의
+1

대신 가입을 사용해보십시오. https://msdn.microsoft.com/en-us/library/bb311040 .aspx? f = 255 & MSPPError = -2147217396 –

+1

먼저 쿼리를 단순화하십시오. 그것이 무엇을 하는지를 이해할 수 없다면 더 빨리 진행할 수 없습니다. 그런 다음 누락 된 색인이 있는지 확인하십시오. 또한 각 항목에 대해 동일한 쿼리를 실행하는 대신 item.CityID 목록을 생성하고'itemCities.Contains (city.CityID)'를 사용하십시오. 이것은 5-10 개의 느린 쿼리 대신 IN (...) 절이있는 단일 쿼리로 변환됩니다. –

+0

@MurrayFoxcroft 제가 처음에는 그렇게 생각하지 않았다는 것을 알고 동의합니다. – Angloos

답변

3

Murray Foxcroft의 응답을 기반으로 새로운 쿼리가 작성되었습니다. 사용중인 개체가 없지만 다음과 비슷한 모양이어야합니다.

var countrylist = from country in countryList 
      join state in stateList 
      on country.CountryID = State.CountryID 
      join city in cityList 
      on state.StateID = city.StateID 
      where 
      city.CityID == item.CityID 
      select new 
      { 
       CountryID = country.CountryIDD, 
       Name = country.Name 
      }; 
+0

당신은 내 천둥을 훔쳐갔습니다 :) OP에 멋지게 코딩 된 답변을 줄 시간을내어 주셔서 감사합니다. –

+0

도움을 주셔서 감사합니다 – Angloos

+0

기꺼이 도와 드리겠습니다! –

0

의 진가를 알아볼 것입니다. 이것은 예외 처리가 필요없는 간단한 코드입니다. 도시를 찾아 try try 블록에서 국가를 얻으려고 할 수 있습니다.

foreach (var item in collection) 
    { 
     var country = countryList.Find(c=> c.CountryID == cityList.Find(c => c.CityID == item.CityID).StateId); 
     item.Country = newCountry 
     { 
      CountryID = country.CountryIDD, 
      Name = country.Name 
     }; 
    }; 
+0

도시에 countryID 필드가 없다. 국가에는시/도가 있습니다. 그래서 City에는 StateID가 있고 State에는 CountryID가 있습니다. – Angloos

+0

아, 코드를 기반으로 가정을 만들었습니다 : select new { city.CountryID } – Kell

+0

예, 제가 너무 복잡하게 만들었습니다. 나는 내가 언제 자고 있다고 생각합니다. 그것을 쓰고 있니? – Angloos