2011-02-24 1 views
1

SOAP를 사용하여 노출되는 RIA 서비스를 작성 중입니다. 메소드 중 하나는 매우 큰 테이블에서 데이터를 읽어야합니다. 내가 좋아하는 일을하고 있었다 초에 ObjectContext, 엔터티 및 로딩 성능

: 나는 성능에 대한 걱정 때문에

public IQueryable<MyItem> GetMyItems() 
{ 
    return this.ObjectContext.MyItems.Where(x => x.StartDate >= start && x.EndDate <= end); 
} 

하지만 그때 멈췄다.

MyItemsis가 완전히로드 된 것을 이해하고 "Where"는 MyItems 속성의 첫 번째 액세스에서로드 된 요소를 필터링합니다. MyItemswill에는 실제로 많은 행이 있기 때문에 이것이 올바른 접근 방식이라고 생각하지 않습니다.

Google에 약간의 질문을했지만 재미있는 결과가 없었습니다.

그래서 GetMyItems 메서드 내에서 컨텍스트의 새 인스턴스를 만들고 MyItems를 선택적으로로드 할 수 있다고 생각했습니다. 다음과 같이하십시오 :

public IQueryable<MyItems> GetMyItems(string Username, DateTime Start, DateTime End) 
    { 
     using (MyEntities ctx = new MyEntities()) 
     { 
      var objQuery = ctx.CreateQuery<MyItems>(
       "SELECT * FROM MyItems WHERE Username = @Username AND Timestamp >= @Start AND Timestamp <= @End", 
       new ObjectParameter("@Username", Username), 
       new ObjectParameter("@Start", Start), 
       new ObjectParameter("@End", End)); 

      return objQuery.AsQueryable(); 
     } 
    } 

그러나 이것이 올바른 방법인지는 잘 모르겠습니다.

저를 도와 주시고 올바른 방법을 알려주십시오.

미리 감사드립니다. 건배, Gianluca.

답변

1

MyItemsis가 완전히로드 된 것을 이해하고 "Where"는 MyItems 속성의 첫 번째 액세스에서로드 된 요소를 필터링합니다.

아니요. 완전히 잘못되었습니다. 실제로 성능 문제가 발생할 때까지 "성능 문제"를 수정하지 마십시오. 이미 가지고있는 코드는 당신이 제안한 코드보다 더 잘 수행 할 것입니다. 그것은 분명히 당신이 묘사하는 방식으로 행동하지 않을 것입니다. 그러나 내 말을 듣지 마십시오. 성능 프로파일 러를 사용하십시오. SQL 프로파일 러를 사용하십시오. 그리고 시험!

+1

나는 이것을 좋아할 것이다. ToTraceString으로 확인한 결과 쿼리가 제공된 매개 변수를 사용하여 빌드 된 것을 볼 수 있습니다. 이는 가능한 성능 문제를 해결하기위한 것입니다. Craig 감사합니다! –

+1

이 게시물을 읽는 다른 사용자의 경우 : http://msdn.microsoft.com/en-us/library/cc853327.aspx에서도이 흥미로운 페이지를 발견했습니다. 건배, G. –