2013-03-28 1 views
2

EF를 사용하여 데이터베이스에서 Name 개의 개체를 선택하기 위해 LINQ를 사용하려고합니다. 문제는 그 오류를 얻고 있다는 것입니다 :DataReader를 닫아야합니다. 첫 번째 및 내 LINQ 쿼리

There is already an open DataReader associated with this Command which must be closed first.

Project가 해당 프로젝트에 대한 정보가 들어있는 타입이다. 이름 클래스의 탐색 속성입니다. 이 오류의 원인이되는 LINQ 쿼리가 잘못되었습니다.

var allNames = from n in _db.DCENames 
       orderby n.BrandName ascending 
       select n; 

foreach (Name name in allNames) 
{ 
    NameDbModel data = new NameDbModel(); 
    data.id = name.Id; 
    data.BrandName = name.BrandName; 
    data.MarkType = name.Project.MarkType; 
    data.DateAdded = name.DateAdded; 
    data.PrimarySector = name.Project.PrimarySector; 
    data.ProjectName = name.Project.ProjectName; 
    data.Status = name.Project.ProjectStatus; 
    data.ProjectId = name.Project.ProjectId; 
    data.Notes = ""; 
    model.Add(data); 
} 
+0

잠재적 중복 [엔티티 프레임 워크 :이 명령과 관련된 열린 DataReader가 이미 있습니다 (HTTP가 : // 유래를 .com/questions/4867602/entity-framework-there-already-open-open-datareader-associated-with-with-comma) –

답변

7

LINQ 쿼리는 데이터 만 가져올 수있는 열거를 만듭니다, 데이터를 가져 오지 않을 것이다, 그래서 당신은 마지막 항목을 가져 때까지 데이터 판독기가 열려 있습니다.

이를 사용하기 전에 목록에 모든 레코드를 읽기 위해 ToList 방법을 사용

foreach (Name name in allNames.ToList()) 
+0

이것은 목록의 여러 열거를 초래할 수 있으므로 대괄호로 질의를 처리하는 것이 가장 좋습니다 그것에 대해'.ToList()'를 호출합니다. +1 지연된 실행 설명 비록. – mattytommo