2014-11-01 3 views
2

Entity Framework 6 및 DbContext을 사용하고 있습니다. 루프에서이 레코드를 사용하기 위해 데이터베이스에서로드 레코드를 열망합니다. 예제로 설명하고 싶습니다. (예를 들어 현실 세계에서는 비현실적입니다.)Entity Framework DbContext 메모리로 레코드를로드하는 방법을 열망하는 방법

저는 학생 목록을 보여주는 DataGridView이 있습니다. Student 테이블에서 모든 레코드의 열은 favorite_subject_id입니다.

DataGridView에서 각 학생의 기록을 보여주는 동안

, 내가 찾아와 Subject 테이블에서 주체 이름을 표시 할 학생의 favorite_subject_id (의 그들 사이에 데이터베이스 관계가없는 가정 해 봅시다. 나는 그것이 실제 프로젝트에 있어야 알고있다. 그러나 그것은 단지 내 질문을 삭제하는 예입니다)

으로는 첫째, 나는 다음과 같은 코드로이 개념 개발 :.

foreach (DataGridViewRow row in gridView.Rows) 
{  
    if (!row.IsNewRow)  
    {  
     var student = (Student)(row.DataBoundItem); 
     var favorite_subject = dbContext.Subjects.find(student.favorite_subject_id); 
     row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString(); 
    } 
} 

을하지만이 코드 구현은 모든 학생 기록에 대한 데이터베이스를 터치합니다. 성능이 저하됩니다.

그래서 루프 전에 메모리에 과목 레코드를 열망하길 원합니다. 루프에서, 나는 열망하는로드 된 레코드를 메모리에서 검색하려고합니다. 문제는 내가 메모리에 레코드를 열심히로드하는 것이 가장 적합한 방법인지 알지 못한다는 것입니다.

이 목적을 위해 몇 가지 코드를 작성했습니다. 그러나 그것이 올바른지 여부는 확실하지 않습니다.

var lstSubjects = dbContext.Subjects.ToList<Subject>(); 

foreach (DataGridViewRow row in gridView.Rows) 
{  
    if (!row.IsNewRow)  
    {  
     var student = (Student)(row.DataBoundItem); 
     var favorite_subject= lstSubjects .Find(x => x.subject_id == student.favorite_subject_id); 
     row.Cells[colFs.Index].Value = favorite_subject.subject_name.ToString(); 
    } 
} 

그래서 질문은 메모리에 데이터베이스의 기록 (DbContext를 사용하여) 열망 부하에 가장 좋은 방법은 무엇입니까?

답변

1

포함을 사용하면 열심히로드 할 수 있지만이 테이블간에 데이터베이스 관계가있는 경우에만 수행 할 수 있습니다.이 시나리오에서는 아래 코드를 사용할 수 있습니다.

dbContext.Students.Include(x=>x.Subjects) 

학생 테이블에 해당하는 학생 및 관계를 나타내는 학생 탐색 세트의 학생용 탐색 세트가 있다고 가정 할 때.

이렇게하면 모든 학생과 관련된 모든 주제가로드됩니다.

+0

그렇다면 'dbContext.Students.Include (x => x.FavoriteSubject)'여야합니다. –

+0

학생 개체의 subject 엔터티에 해당하는 탐색 속성의 이름은 무엇이든됩니다 .i는 Subject라고 가정합니다. – Jags

+0

그는'favorite_subject.subject_name' 다음에 있습니다. 그래서 내가 말하고자하는 것은 네비게이션 속성 (있는 경우)이 컬렉션 대신 하나의 객체를 가리킨다는 것입니다. –