2010-08-18 4 views
0

나는 두 개의 테이블이 하나의 외래 키 "PointID"로 연결, 한 부모 "포인트"한 아이 "PointValue", 2005 년이 간단한 LINQ의 성능을 어떻게 향상시킬 수 있습니까?

은 내가 LINQ가 SQL Server의 일대 다 관계를 만들어가 질문 : 당신은에서 볼 수 있듯이

 var points = from p in ContextDB.Points 
        //join v in ContextDB.PointValues on p.PointID equals v.PointID 
        where p.InstanceID == instanceId 
        orderby p.PointInTime descending 
        select new 
        { 
         Point = p, 
         Values = p.PointValues.Take(16).ToList() 
        }; 

조인 주석하고 "값"할당은 "포인트"테이블 "PointValue는"("포인트"및 LINQ에 의해 "PointValues"라고 함)하는 관계를 가지고있다.

"var points"IQueryable (예 : GridView에 바인딩 할 때 등)을 반복 할 때 초기 쿼리는 매우 빠르지 만 "Values"속성을 반복하는 것은 매우 느립니다. SQL 프로파일 러는 "포인트"의 각 값에 대해 IQueryable 다른 쿼리가 실행된다는 것을 보여줍니다.

어떻게 이것을 하나의 쿼리로 만들 수 있습니까?

흥미롭게도 초기 쿼리는 조인의 주석을 제거 할 때 매우 느려집니다.

답변

1

난 당신이 여기에 설명 된 DataLoadOptions.LoadWith 방법을 사용하려는 생각 :
http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx

귀하의 경우에 당신은 다음과 같은 것을 할 것입니다, 당신의 DataContext를 만들 때 :

DataLoadOptions options = new DataLoadOptions(); 
ContextDB.LoadOptions = options; 
options.LoadWith((Point p) => p.PointValues); 
+0

고맙습니다. 궁극적으로 두 번째 테이블은 FK를 사용하여 추출 할 수 있기 때문에 별도의 쿼리로이를 수행하여 List로 변환 한 다음 메모리 내 목록에서 반복 쿼리를 수행합니다. 이것은 매우 빠르다는 것이 밝혀졌습니다. –

관련 문제