2012-10-10 6 views
0

내 dbml에 마스터 테이블 "M"및 세부 테이블 "D1"이 포함되어 있습니다.asp.net에서 Linq 지연 실행

내 aspx 페이지는 M 데이터를 표시하는 TextBox와 D1 데이터로 채우기위한 표로 구성됩니다. 로드 시간을 절약하기 위해 버튼을 클릭하면 그리드가 채워지 길 원합니다 (D1에는 많은 행이 포함됨).

질문 1 : 다음 코드가 올바른 방법입니까?

protected void Page_Load(object sender, EventArgs e) 
{ 
    MyDataContext context = new MyDataContext(); 
    M m = context.Ms.Single(n => n.id == id); // id is somehow provided 

    TextBox1.Text = m.field1; 
} 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    MyDataContext context = new MyDataContext(); 
    M m = context.Ms.Single(n => n.id == id); // id is somehow provided 

    Grid1.DataSource = m.D1s; 
    Grid1.DataBind(); 
} 

질문 2 : 내가를 Page_Load에서 m.D1s에 액세스 할 수 있기 때문에이 상세 데이터가 어쨌든 이미 데이터베이스에서 가져온 또는 연기 실행이 적용됩니까 의미합니까?

답변

1

명시 적으로 하위를로드하지 않으면로드가 지연됩니다. 문제가있는 경우 요청에 프로파일 러를 연결하고 프로그램에 디버그하여 쿼리가 발행 된시기를 확인하십시오.

LINQ to SQL의 자식로드를 열렬하게로드하려면 LoadWithions with LoadWith 작업을 사용하십시오. 이 경우

protected void Button1_Click(object sender, EventArgs e) 
    { 
     MyDataContext context = new MyDataContext(); 
     var lo = new DataLoadOptions(); 
     lo.LoadWith<M>(m => m.D1s); 
     context.LoadOptions = lo; 

     M m = context.Ms.Single(n => n.id == id); // id is somehow provided 
      Grid1.DataSource = m.D1s; 
     Grid1.DataBind(); 
    } 

, 이미 페이지로드에 설정된 이후 그냥 버튼을 클릭 핸들러에서 M를 다시로드하지 않고 적절한 D1S로드의 m 필요하지 않은 경우 :

protected void Button1_Click(object sender, EventArgs e) 
{ 
    using (MyDataContext context = new MyDataContext()) 
    { 
     IQueryable<D> D = context.D1s.Where(d => d.Mid == id); 
     // id is somehow provided 
     Grid1.DataSource = D; 
     Grid1.DataBind(); 
    } 
} 
+0

을> 프로파일 러를 요청에 첨부하고 프로그램에 디버그하여 쿼리가 발행 된시기를 확인하십시오. 매우 흥미 롭습니다. 그것을하는 방법에 대한 모든 예제? – dpant

+0

http://www.thinqlinq.com/Post.aspx/Title/LINQ-to-Database-Performance-hints에서 몇 가지 제안 사항이 있습니다. –